Kontener obiektów - problem z metodą
Ostatnio zmodyfikowano 2013-01-16 17:51
MattiH Temat założony przez niniejszego użytkownika |
Kontener obiektów - problem z metodą » 2013-01-16 16:00:17 Witam wszystkich Forumowiczów! Na początku uprzedzam - nie jestem jakiś zaawansowanym programistą, więc mogę pisać głupoty :) Chcę(a właściwie muszę) napisać napisać program wykorzystujący klasy i metody wirtualne. Stworzyłem klasę bazową(Figure) zawierającą metody wirtualne(Area) po której dziedziczą klasy potomne(Circle i Square). Do tego momentu wszystko działa dobrze. Teraz chcę stworzyć klasę kontenera, która będzie przechowywała obiekty innych klas. Za bardzo nie wiedziałem jak to zrobić, więc użyłem klasy vector. Okazuje się, że tego też nie wiem jak używać :) Dokładniej - o ile metoda 'GetName()' działa tak jak powinna, to 'Area()' wyrzuca 'not a number'. Zamieszczam kod źródłowy mojego programu: #include <iostream> #include <vector> using namespace std;
class Figure { public: Figure(); ~Figure(); virtual double Area(); virtual void GetName(); protected: string Name; };
class Square : public Figure { public: Square( string, int ); ~Square(); double Area(); private: double Side; };
class Circle : public Figure { public: Circle( string, int ); ~Circle(); double Area(); private: double Radius; };
Figure::Figure() { }
Figure::~Figure() { }
Square::Square( string nazwa, int bok ) { Name = nazwa; Side = bok; }
Square::~Square() { }
Circle::Circle( string nazwa, int r ) { Name = nazwa; Radius = r; }
Circle::~Circle() { }
double Figure::Area() { }
double Square::Area() { return Side * Side; }
double Circle::Area() { return Radius * Radius * 3.14; }
void Figure::GetName() { cout << Name << endl; }
int main() { vector < Figure > tab; tab.push_back( Circle( "Kolo duze", 10 ) ); tab.push_back( Circle( "Kolo malutkie", 5 ) ); tab.push_back( Circle( "Kwadracik", 1 ) ); tab.push_back( Circle( "Kwadrat-gigant", 100 ) ); for( int i = 0; i < tab.size(); i++ ) { tab[ i ].GetName(); cout << tab[ i ].Area() << endl; } return 0; } |
|
DejaVu |
» 2013-01-16 17:43:45 To nie będzie działało. std::vector < Figure * > tab;
Tak powinien wyglądać kontener i do niego powinieneś wrzucać obiekty utworzone za pomocą operatora 'new'. /edit: Dodam jeszcze, że w kodzie masz komentarz: Po tym komentarzu podajesz definicje metod, a nie deklaracje. Definicja metody = implementacja metody. Deklaracja metody to linijka, która zawiera tylko i wyłącznie nazwę metody + argumenty jakie przyjmuje (oraz zwracaną wartość). |
|
MattiH Temat założony przez niniejszego użytkownika |
» 2013-01-16 17:47:00 Wielkie dzięki! Wszystko teraz pięknie śmiga :)
P.S. Dziękuję także za znalezienie moich bzdur w komentarzach. Musze jeszcze doczytać, ale przynajmniej działa ;) |
|
DejaVu |
» 2013-01-16 17:51:31 Co do tych bzdur to jak mam być szczery to przez długi czas sam nie wiedziałem, która nazwa co opisuje :P (dopóki Iname mnie nie uświadomił). Jeżeli używasz Visual C++ to tam pod prawym klawiszem masz go to declaration i go to definition - więc jak tego będziesz używał to prędzej czy później zapamiętasz co jest deklaracją, a co definicją. Logi kompilacji też informują, że np. brakuje 'definicji' czyli implementacji jakiejś funkcji. |
|
« 1 » |