• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Poprawność kodu C++

Cloud VPS
+1 głos
401 wizyt
pytanie zadane 11 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,630 p.)

Witam, dla czego w tym kodzie pojawia mi się błąd w 52 i 58 linijce, że utworzyłem już obiekt o nazwie bohater, skoro całość jest w instrukcji switch i każdy przypadek powinien się wykonać tylko, jeśli zostanie spełniony warunek podany w instrukcji case

#include <iostream>
#include <conio.h>

using namespace std;

class Wojownik
{
    int sila;

    void etap ( int e )
    {
        sila = 20 * e;
    }
};

class Mag
{
    int sila;

    void etap ( int e )
    {
        sila = 15 * e;
    }
};

class Zlodziej
{
    int sila;

    void etap ( int e )
    {
        sila = 5 * e;
    }
};

int wybor_postaci ();

int main()
{
    int postac = wybor_postaci ();

    switch ( postac )
    {
        case 1:

        Wojownik bohater;

        break;

        case 2:

        Mag bohater;

        break;

        case 3:

        Zlodziej bohater;

        break;
    }

    bohater.etap ( 1 );

    cout << bohater.slia;

    return 0;
}

int wybor_postaci ()
{
    cout << "Wybierz postać:" << endl;

    cout << "[ 1 ] - Wojownik" << endl;

    cout << "[ 2 ] - Mag" << endl;

    cout << "[ 3 ] - Złodziej" << endl;

    char wybor;

    for ( int a = 1; a == 1; )
    {
        wybor = getch ();

        switch ( wybor )
        {
            case '1':

                a = 2;

                return 1;

            break;

            case '2':

                a = 2;

                return 2;

            break;

            case '3':

                a = 2;

                return 3;

            break;
        }
    }
}

 

1 odpowiedź

+3 głosów
odpowiedź 11 kwietnia 2021 przez j23 Mędrzec (195,240 p.)
wybrane 11 kwietnia 2021 przez Dawidziu
 
Najlepsza

Tu powinieneś wykorzystać polimorfizm, bo tak,  jak to zrobiłeś, nie będzie działać. C++ jest językiem ze statycznym typowaniem, zatem typ zmiennej bohater musi być określony w trakcie kompilacji (a Ty próbujesz go określić w trakcie działania programu, w switchu).

komentarz 11 kwietnia 2021 przez Dawidziu Bywalec (2,630 p.)
A czy dało by się ten kod tak przerobić, żeby zachować wszystkie jego kluczowe elemeny, ale żeby działał?
1
komentarz 11 kwietnia 2021 przez j23 Mędrzec (195,240 p.)

Tak jak pisałem - użyć polimorfizmu:

class Postac 
{
protected:
    int sila = 0;
    
public:
    virtual void etap(int) = 0;

};

class Wojownik : public Postac 
{
public:
    void etap(int e)
    {
        sila = 20 * e;
    }
};

class Mag : public Postac
{
public:
    void etap(int e)
    {
        sila = 15 * e;
    }
};

class Zlodziej : public Postac
{
public:
    void etap(int e)
    {
        sila = 5 * e;
    }
};

i wtedy:

#include <memory>

/* ... */

std::unique_ptr<Postac> bohater;

switch ( postac )
{
case 1:
    bohater = std::make_unique<Wojownik>();
    break;

case 2:
    bohater = std::make_unique<Mag>();
    break;

case 3:
    bohater = std::make_unique<Zlodziej>();
    break;
    
default: 
    //wtf?!
}
 
bohater->etap(1);

Oczywiście poczytaj o polimorfizmie, by wiedzieć, co tu się dzieje i czy aby na pewno o to Ci chodzi.

Podobne pytania

0 głosów
1 odpowiedź 852 wizyt
pytanie zadane 8 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,630 p.)
0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 3 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,630 p.)
0 głosów
2 odpowiedzi 522 wizyt
pytanie zadane 4 listopada 2019 w C i C++ przez Gw0zdziu09 Nowicjusz (180 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,908 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...