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

Poprawność kodu C++

Object Storage Arubacloud
+1 głos
187 wizyt
pytanie zadane 11 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 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 (194,920 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,610 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 (194,920 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ź 493 wizyt
pytanie zadane 8 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)
0 głosów
1 odpowiedź 261 wizyt
pytanie zadane 3 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)
0 głosów
2 odpowiedzi 208 wizyt
pytanie zadane 4 listopada 2019 w C i C++ przez Gw0zdziu09 Nowicjusz (180 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...