ďťż

Ładny brzuch

Co w poniższym kodzie jest źle:( z megatutoriala)

#include <iostream> #include <ctime> using namespace std; enum ANIMAL { A_BASE, A_FISH, A_MAMMAL, A_BIRD }; class CAnimal {   // (pomijamy pozostałe składowe klasy   public:    virtual ~CAnimal(){}       virtual void Oddychaj()               { std::cout << "Oddycham..." << std::endl; }    virtual ANIMAL Typ() const { return A_BASE; } }; class CFish : public CAnimal {   public:         void Oddychaj()   // redefinicja metody wirtualnej               { std::cout << "Oddycham skrzelami..." << std::endl; }         void Plyn();   ANIMAL Typ() const { return A_FISH; } }; class CMammal : public CAnimal {   public:         void Oddychaj()   // jak wyżej               { std::cout << "Oddycham plucami..." << std::endl;   }         void Biegnij();   ANIMAL Typ() const { return A_MAMMAL; } }; class CBird : public CAnimal {   public:         void Oddychaj()   // i znowu jak wyżej :)               { std::cout << "Oddycham plucami..." << std::endl; }         void Lec();   ANIMAL Typ() const { return A_BIRD; } }; CAnimal *StworzLosoweZwierze() { // zainicjowanie generatora liczb losowych srand(static_cast<int>(time(NULL))); // wylosowanie liczby i stworzenie obiektu zwierza switch (rand() % 3) { case 0: return new CFish; case 1: return new CMammal; case 2: return new CBird; default: return NULL; } } int main() { CAnimal *pZwierzak = StworzLosoweZwierze(); switch (pZwierzak->Typ()) { case A_FISH: static_cast<CFish*>(pZwierzak)->Plyn(); break;    case A_MAMMAL: static_cast<CMammal*>(pZwierzak)->Biegnij(); break; case A_BIRD: static_cast<CBird*>(pZwierzak)->Lec(); break; } return 0; }



No cóż, trudno mi kwestionować Xion'a. Pewnie dobrze zrobił, ale coś spierniczył. Puki nie ma Temporal'a, to ci podam moją metodę na takie rzeczy:
int main() { CAnimal *pZwierzak = StworzLosoweZwierze(); switch (pZwierzak->Typ()) { case A_FISH :  ((CFish*)pZwierzak)->Plyn();  break; case A_MAMMAL :  ((CMammal*)pZwierzak)->Biegnij();  break; case A_BIRD :  ((CBird*)pZwierzak)->Lec();  break; } return 0; }
// EDIT
Temp: Hmm, ja myślałem, że on podał niekompletny kod :P. A dlaczego uważasz, że te rzutowanie jest brzydkie :) Dla mnie wydaje się krutsze :)
Użytkownik Real_Noname edytował ten post 03 lipiec 2005, 20:34
Może brakuje definicji funkcji `CBird::Lec()', CMammal::Biegnij(), CFish::Plyn().
pozdr.
Po dopisaniu zadziałało.
BTW. Jeżeli daje się using namespace std, to chyba po to żeby nie pisać std::cout, tylko po prostu cout :?
Użytkownik zgredźmin edytował ten post 03 lipiec 2005, 16:05
Lol ;]
Xion nie pisał chyba tego jako kompletny kod, gotowy do skompilowania, nie?
Jak napisał Zgredźmin, brakowało definicji funkcji CBird::Lec(), CFish::Plyn() i CMammal::Biegnij(). Po prostu sobie je dopisz, i będzie działało.

A co do std:: - ja nie daje using namespace std;, tylko wszędzie piszę std:: - to zależy już tylko od przyzwyczajeń i od tego co kto uznaje za bardziej estetyczne, ALE użycie using namespace std; tak na prawdę pozbawia sensu istnienia tej przestrzeni nazw - bo po co wprowadzać namespace std i zapobiegać konfliktom nazw, skoro użytkownik i tak ją uglobalnia?.

PS. Real_Noname ;) thx ;]
Pozdrawiam.

//EDIT
Real_Noname - Twój sposób praktycznie nic nie zmienia - po prostu zastępujesz ładne rzutowania z C++ brzydkimi z C ;] ;].
Użytkownik TeMPOraL edytował ten post 03 lipiec 2005, 18:10
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •