list führt in Klasse zu Linker Error.



  • Folgender Code treibt mich zur Verzweiflung:
    Ich versuche eine Liste als Member meiner Klasse zu erstellen. Eigentliches Ziel wäre es sämtliche Instanzen in dieser static list zu speichern. Allerdings gelingt mir das ob des linkers nicht, der meine Bemühungen mit einem "fatal error LNK1120: 1 unaufgeloeste externe Verweise" (VC++ 6.0) bzw. " [Linker error] undefined reference to `CTest::LTest' "(DevC++ 4.9.9.1) quittiert.
    Ich habe den Code auf ein Minimum reduziert welches das Problem abbildet.
    Die liste ausserhalb der Klasse funktioniert problemlos, nur innerhalb der Klasse gibt es mecker.
    Ich bin noch sehr unbedarft was c angeht und hoffe jemand kann mir hier licht ins Dunkel bringen.

    Gruß Blade

    #include <cstdlib>
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    class CTest
        { private:
                static list<int> LTest;
          public:
                CTest()
                {    
                    LTest.clear();
                    LTest.push_back(1);
    				cout << "hab grad ne Instanz erstellt" <<endl;
                }
        };
    
    int main(int argc, char *argv[])
    {   list<int> testlist;
        testlist.push_back(1);
        //cout <<testlist.size();
        CTest test;
        system("PAUSE");
        return EXIT_SUCCESS;
    


  • du musst deine statische Membervariable auch irgendwo (in einem Sourcefile) definieren 😉



  • Man verzeihe mir meine gnadenlose Dummheit, aber ich wüsste nicht wie ich das anstellen sollte.
    Meine versuche die Liste per new zu initialisieren scheiterten, ebenso wie der Versuch sie auf 0 zu setzen um sie in einen definierten Zustand zu bringen.
    Wie schon erwähnt bin ich noch sehr unerfahren mit c. Ich arbeite grade ein Buch durch, und kenne das Konzept der Listen aus anderen Sprachen. Ich wollte daher die Listen integrieren, aber eine Unterbringung in der Klasse macht es mir etwas schwer.
    Ich frag nur ungern nach Beispielcode, aber ich bin echt ratlos.



  • new und NULL(bzw. 0) sind für zeiger, du musst einfach den default-ctor nehmen:

    CTest::LList = list<int>();
    


  • So:

    [cpp]#include <cstdlib>
    #include <iostream>
    #include <list>

    using namespace std;

    class CTest
    { private:
    static list<int> LTest;
    public:
    CTest()
    {
    LTest.clear();
    LTest.push_back(1);
    cout << "hab grad ne Instanz erstellt" <<endl;
    }
    };

    CTest::list<int> LTest;
    int main(int argc, char *argv[])
    { list<int> testlist;
    testlist.push_back(1);
    //cout <<testlist.size();
    CTest test;
    system("PAUSE");
    return EXIT_SUCCESS;



  • #include <cstdlib>
    #include <iostream>
    #include <list>
    
    using namespace std;
    
    class CTest
        { public:
                static list<int> LTest;
    
                CTest()
                {   
                    //LTest.clear();
                    //LTest.push_back(1);
    				cout << "hab grad ne Instanz erstellt" <<endl;
                }
        };
    
    int main(int argc, char *argv[])
    {   list<int> testlist;
        testlist.push_back(1);
        CTest::LTest = list<int>();
        //CTest test;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Geht auch nicht. Ich muss feststellen dass das sehr frustran ist.
    Edit: TNTnets code wird mit einem syntax error quittiert.



  • #include <cstdlib> 
     #include <iostream> 
     #include <list> 
    
     using namespace std; 
    
     class CTest 
         { private: 
                 static list<int> LTest; 
           public: 
                 CTest() 
                 {     
                     LTest.clear(); 
                     LTest.push_back(1); 
                     cout << "hab grad ne Instanz erstellt" <<endl; 
                 } 
         }; 
    
     list<int> CTest::LTest;
     int main(int argc, char *argv[]) 
     {   list<int> testlist; 
         testlist.push_back(1); 
         //cout <<testlist.size(); 
         CTest test; 
         system("PAUSE"); 
         return EXIT_SUCCESS;
     }
    


  • Wow, herzlichen Dank. Die masse an Möglichkeiten und damit auch der potentiellen Fehler ist echt erschlagend. Ich werd versuchen mir zu merken wie das geht, und jetzt wo ich es seh gibts auch nen Sinn. Nur selber drauf gekommen wär ich wohl nie.
    Nochmals Danke

    Gru0
    Blade


Anmelden zum Antworten