Linker Error w Dev-C++


(Mateusz Bolewski) #1

Otóż mam taki problem. Piszę spory projekt z C++ i mam w nim klasy które dziedziczą po sobie. Mam do stworzenia obiekty i operacje na tych obiektach. Obiekty chciałem umieścić na liście statycznej. Oto kod:

#include 

#include 

#include 

#include 

#include 

#include 


using namespace std;


//Klasa nadrzędna

class A

{

      private: 

               int licA;

      protected: 

                 int liczA;

      public:

};


//Klasa podrzędna

class B : public A

{

      private:

              int licB;

      protected:

                int liczB;

      public:      

};


//Klasa podrzędna

class C : public A

{

      private:

              int licC;

      protected:

                int liczC;

      public:


};


//Liść

class D : public B

{

      private:

              int licD;

              string nazwa;

      protected:

                int liczD;

      public:

             static list objectsD;

             D(string _nazwa, int _liczA, int _liczB, int _licD, int _liczD); 

             friend void utworz_obiekt_D();    

             friend void usun_obiekt_D();  

};


D::D(string _nazwa, int _liczA, int _liczB, int _licD, int _liczD)

{

            nazwa=_nazwa;

            liczA=_liczA;

            liczB=_liczB;

            licD=_licD;

            liczD=_liczD;

            objectsD.push_back(*this);

}


//Deklaracja pozostałych klas


//FUNKCJE TWORZĄCE OBIEKTY

void utworz_obiekt_D()

{

     string nazw;

     int licd, liczd, liczb, licza;


     cin >> nazw;


     cout << "Liczba A: ";

     cin >> licza;

     cout << endl;


     cout << "Liczba B: ";

     cin >> liczb;

     cout << endl;


     cout << "Pierwsza liczba D: ";

     cin >> licd;

     cout << endl;


     cout << "Druga liczba D: ";

     cin >> liczd;

     cout << endl;


     D* objektD;

     objektD = new D(nazw,licza,liczb,licd,liczd);

     cout << "Do klasy D utworzono obiekt: " << nazw << "\n";

}


//pozostałe funkcje dodające obiekty


// ******************************************************************************


//FUNKCJE USUWAJACE OBIEKT

void usun_obiekt_D()

{

     string nazw;

     int stan = 0;

     list::iterator z;

     z=D::objectsD.begin();


     cin >> nazw;


     while(z != D::objectsD.end())

     {

           if (z->nazwa == nazw)

           {

                D::objectsD.erase(z);   

                cout <<"Z klasy D pomyslnie usunieto obiekt o nazwie: " << nazw <<"\n";

                stan = 1;

                break;    

           }  

     z++;                 

     }

     if (stan==0)

     {

           cout << "Obiekt o nazwie " << nazw << " nie istnieje w klasie D!\n";      

     }

}


//DRZEWO PROJEKTU

void drzewko()

{

     cout <<" A" <
     cout <<" |" <
     cout <<" ---------------------" <
     cout <<" | |" <
     cout <<" B C" <
     cout <<" | |" <
     cout <<"----------- -----------" <
     cout <<"| | | |" <
     cout <<"D E F G" <
     cout <<" | | |" <
     cout <<" ---- ---- ---------" <
     cout <<" | | | | |" <
     cout <<" H --- I J K" <
     cout <<" | |" <
     cout <<" ------- ---" <
     cout <<" | | |" <
     cout <<" L M N" <
}


int main(int argc, char *argv[])

{

    int n;

    cout << "Czy chcesz zobaczyc drzewo swojego projektu? Jesli tak to wcisnij 1!\n";

    cin >> n;

    if (n==1)

    {

             drzewko();

    }

    cout << endl;

    system("PAUSE");

    return EXIT_SUCCESS;

}

[/code]

problem jest taki że w trakcie kompilacji wywala mi [Linker error] undefined reference to `D::objectsD' i tak jest do każdej klasy, która ma listę obiektów. Wie ktoś czemuż się tak dzieje??


(Wojtekbogocki) #2

Wiem na pewno, że nie powinieneś używać Dev'a - nie jest już od dawna rozwijany, ma wyjątkowo toporną obsługę i prehistoryczną wersję gcc. Mógłbyś spróbować Code Blocks albo Visual C++.


(Mateusz Bolewski) #3

Znalazłem rozwiązanie. Po prostu przed funkcją główną muszę zadeklarować używane w klasach listy.

list D::objectsD;


int main(int argc, char *argv[])

{

    int n;

    cout << "Czy chcesz zobaczyc drzewo swojego projektu? Jesli tak to wcisnij 1!\n";

    cin >> n;

    if (n==1)

    {

             drzewko();

    }

    if (n==2)

    {


    }

    cout << endl;

    system("PAUSE");

    return EXIT_SUCCESS;

}

Temat do zamknięcia.