Lista kilku typów.

0

Witam, męczę się z tym problemem od kilku dni.
Mam do napisania program w którym muszę stworzyć kilka potworków, każdy ma być osobną klasą i wszystkie te potworki muszę zapisać na jednej liście, nie da się stworzyć (przynajmniej ja nic o tym nie wiem) listy różnych typów, dlatego zacząłem kombinować z dziedziczeniem, zrobiłem klasę podstawową creature i od niej 4 pochodne, reprezentujące danego potwora, potem listę typu creature ale to też nie zadziałało, próbowałem jeszcze pobawić się z funkcjami wirtualnymi jednak też mi nie wyszło. Przypuszczam że da się to jakoś rozwiązać za pomocą tych funkcji wirtualnych ale moja wiedza pewnie jest za mała dlatego proszę o jakąś wskazówkę jak się za to zabrać.

0

Wrzuć kod, w którym z dziedziczeniem Ci nie wyszło.

0

Zanim zacząłem bawić się w robienie tego programu chciałem zobaczyć czy wgl zadziała więc zrobiłem coś takiego na "samochodach". Miałem nadzieję że zadziała, niestety nie zadziałało :) Jak zrobiłem coś głupiego to wybaczcie ale dopiero zaczynam zabawę z dziedziczeniem i polimorfizmem

 
class Car
{
    public:
        Car();
        virtual int getVelocity() = 0;

};


class Ferrari : public Car
{
    public:
        Ferrari();
        void setVelocity(int);
        virtual int getVelocity();
       
    private:
        int velocity;
};



Ferrari auto1,auto2;
list<Car> lista;
list<Car>::iterator iter;

int main()
{

    auto1.setVelocity(20);
    auto2.setVelocity(25);
    lista.push_back(auto1);
    lista.push_back(auto2);

    for(iter=lista.begin(); iter!=lista.end();iter++){
        cout << iter->getVelocity()<<endl;
    }
0

Spójrz na posta @krwq, patrz też uważnie co podpowiada kompilator.

0

Pisząc program napotkałem kolejny problem. Otóż moja pani profesor, kazała mi się pozbyć tych funkcji wirtualnych które są niepotrzebne, dlatego zastanawiam się czy można dostać się do zmiennej speed (widać to poniżej) nie robiąc funkcji wirtualnej w klasie Car, myślałem że można po prostu metodę getSpeed umieścić tylko w Ferrari i nie będzie problemu ale wyskakuje że klasa Car nie posiada funckji getSpeed(). Oto kod:

 #include <iostream>
#include <list>
using namespace std;
 
class Car
{
    public:
        //Car();
        virtual int getVelocity() = 0;
 		//virtual int getSpeed() = 0;
};
 
 
class Ferrari : public Car
{
    public:
        Ferrari(int a){ speed = a; }
        void setVelocity(int v) { velocity=v; }
        virtual int getVelocity() { return velocity; } 
 		//int getSpeed() {return speed} tak nie zadziała
 		//virtual int getSpeed() {return speed) <- tak wiem że zadziała
    private:
        int velocity;
        int speed;
};
 
 
 
int main()
  {
   Ferrari auto1(20),auto2(10);
   list<Car*> lista;
 
 
    auto1.setVelocity(20);
    auto2.setVelocity(25);
    lista.push_back(&auto1);
    lista.push_back(&auto2);
 
    for(list<Car*>::iterator iter=lista.begin();iter!=lista.end();++iter){
        cout << (*iter)->getSpeed()<<endl;       //  < ---- Jak sie dostać?
		cout << (*iter)->getVelocity()<<endl;
    }
    return 0;
}
0

Jakie było kryterium na podstawie którym pani profesor stwierdziła że getSpeed jest niepotrzebne?

czy można dostać się do zmiennej speed (widać to poniżej) nie robiąc funkcji wirtualnej w klasie Car

Jakbyś zmienił dostęp speed na publiczny mógłbyś użyć dynamic_cast

#include <iostream>
#include <list>
using namespace std;
 
class Car
{
    public:
        //Car();
        virtual int getVelocity() = 0;
         //virtual int getSpeed() = 0;
};
 
 
class Ferrari : public Car
{
    public:
        Ferrari(int a){ speed = a; }
        void setVelocity(int v) { velocity=v; }
        virtual int getVelocity() { return velocity; } 
         //int getSpeed() {return speed} tak nie zadziała
         //virtual int getSpeed() {return speed) <- tak wiem że zadziała
         int speed;
    private:
        int velocity;
        
};
 
Ferrari* ObtainFerrari(Car *c)
{
	return dynamic_cast<Ferrari*>(c);
}
 
int main()
  {
   Ferrari auto1(20),auto2(10);
   list<Car*> lista;
 
 
    auto1.setVelocity(20);
    auto2.setVelocity(25);
    lista.push_back(&auto1);
    lista.push_back(&auto2);
 
    for(list<Car*>::iterator iter=lista.begin();iter!=lista.end();++iter){
        Ferrari *ferr = ObtainFerrari(*iter);
        if(ferr != NULL){
        	cout<< ferr->speed <<endl;
        }
        cout << (*iter)->getVelocity()<<endl;
    }
    return 0;
}

edit
To tak w ramach nie wstawiania gotowców leniwym studentom co nie?

edit2
To co robisz to nie żadna lista typów, może pomyśl o zmianie nazwy tematu?

0

Może jej chodziło o to że trudno sobie wyobrazić Car które nie posiada żadnej prędkości (bo to była by raczej jakaś nieruchomość) w związku z czym akurat speed musi być już przy Car.

0

@several To nie jest żaden gotowiec bo ten kod to tylko przykład, zadanie które robię jest dużo większe więc, stwierdziłem że nie ma sensu całego tamtego kodu tutaj wklejać. W takim razie jak nazwać temat?

@_13th_Dragon Tak jak powiedziałem ten kod jest tylko przykładem, więc nie przyczepiła się konkretnie do funkcji getSpeed() ani speed tylko ogólnie że niektóre funkcje niepotrzebnie są wirtualne, część tych które wiedziałem jak już przerobiłem, ale zastanawiam się czy da się jakoś dostać speed bez użycia funkcji wirtualnej bo z tego co zrozumiałem też się da. Spróbowałem po prostu zrobić definicję w funkcji Ferrari i myślałem, że pointer wskaże na tę klasę i użyje metody getSpeed() ale tak jak się spodziewałem wyskoczył błąd że w klasie Car nie ma metody getSpeed(). Jeśli nie da się, lub da się tylko za pomocą dynamic_cast o którym nie mam pojęcia, to może źle zrozumiałem i te funkcje które przerobiłem już usatysfakcjonują wykładowcę :)

0

Generalnie to się da:

Car *car=new Ferrari(20);
Ferrari *f=dynamic_cast<Ferrari*>(car);
if(f) cout<<f->getVelocity()<<endl;
else cout<<"nie jest to Ferrari"<<endl;

Z tym że nie jest to dobry pomysł.

1 użytkowników online, w tym zalogowanych: 0, gości: 1