Ĺ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
#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