Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kontener obiektów - problem z metodą

Ostatnio zmodyfikowano 2013-01-16 17:51
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <vector>
using namespace std;

/*********************************************/
/**** Deklaracje klas bazowej i potomnych ****/
/*********************************************/

class Figure // klasa bazowa
{
public:
    Figure();
    ~Figure();
    virtual double Area(); //wirtualna metoda obliczajaca pole figury
    virtual void GetName(); // wirtualna metoda wskazujaca nazwe
protected:
    string Name;
};

class Square
    : public Figure //klasa potomna
{
public:
    Square( string, int );
    ~Square();
    double Area();
private:
    double Side;
};

class Circle
    : public Figure //to też klasa potomna
{
public:
    Circle( string, int );
    ~Circle();
    double Area();
private:
    double Radius;
};

/*********************************************/
/**** Deklaracje konstruktorów i destrukt  ***/
/*********************************************/

Figure::Figure() //pusty konstruktor Figure...
{
}

Figure::~Figure() //... i destruktor
{
}


Square::Square( string nazwa, int bok ) //c.d.
{
    Name = nazwa;
    Side = bok;
}

Square::~Square()
{
}

Circle::Circle( string nazwa, int r )
{
    Name = nazwa;
    Radius = r;
}

Circle::~Circle()
{
}


/*********************************************/
/************* Deklaracje metod  *************/
/*********************************************/

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;
    }
   
    /*Figure* p1 = new Square("Kwadrat", 5);
         p1->GetName();
         cout<<p1->Area()<<endl;
        Figure* p2 = new Square("Kolo", 10);
         p2->GetName();
         cout<<p2->Area()<<endl;*/
   
    return 0;
}
P-74118
DejaVu
» 2013-01-16 17:43:45
To nie będzie działało.
C/C++
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:
C/C++
/************* Deklaracje metod  *************/
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ść).
P-74126
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 ;)
P-74127
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.
P-74130
« 1 »
  Strona 1 z 1