std::list fehler?!?



  • ich habe folgende Klasse

    class blaList{
    private:
    	 static std::list<std::string> werteListe;
    public:
    	 static void setString(std::string wert){
    		werteListe.push_front(wert);
    	}
    
    };
    

    wenn ich jetzt mit

    blaList::setString("Hallo")
    

    versuche etwas einzufügen bekomme ich ein LNK2001 linker Fehler. Was mache ich da falsch bzw welche lib muss ich hinzulinken?



  • Bitte den ganzen Linkerfehler posten.
    Ich denke aber dein Problem ist, dass die blaList::werteListe nirgendwo definiert wurde. Mach das in einer Cpp-Datei.


  • Mod

    Vermutlich hast du werteListe nirgendwo definiert. Statische Klassenvariablen müssen schließlich irgendwo "leben".

    Soll das überhaupt alles static sein? Das kommt mir äußerst ungewöhnlich vor.



  • error LNK2001: unresolved external symbol "private: static class std::list<class std::basic_string<char,struct std::char_traits<char>, 
    class std::allocator<char> >, class std::allocator<class std::basic_string<char,struct std::char_traits<char>, class std::allocator<char> > > > listeClass::listWerte"
    
    (?listWerte@listeClass@@0V?$list@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@
    std@@A)
    

    Das ist was als Fehler ausgegeben wird. Am Variablennamen liegt es nicht habe es geändert und kompiliert.



  • Du musst eine C++ Datei anlegen und darin die Variable definieren. Das ist bloß eine Deklaration.



  • Wie kann ich die Variable definieren wenn sie private ist?

    ich check nichts mehr 😕



  • Hat vielleicht jmd noch eine Idee?

    Die Definition was PI angesprochen hat scheitert, weil wie am Code sichtbar private ist. Ich brauche die umbedingt um weiter arbeiten zu können! 😕



  • std::list<std::string> blaList::werteListe;
    

    in einer *.cpp Datei.

    SeppJs Frage bleibt dennoch offen.



  • Wenn es nicht static ist wie soll ich dann bei setString auf die Liste zugreifen können. Ich möchte aus dieser Klasse kein Objekt erzeugen sondern sie soll von allen Klassen zugreifbar sein.



  • Wenn du keine Objekte anlegen willst, wozu brauchst du dann überhaupt eine Klasse?

    (wegen "private": Das bedeutet nur, daß niemand außerhalb der Klasse die Variable verwenden darf - die Definition ist trotzdem erlaubt und notwendig)



  • Beobachter01 schrieb:

    Ich möchte aus dieser Klasse kein Objekt erzeugen

    Warum ist des dann überhaupt eine Klasse? Mach's doch als einen Satz von freien Funktionen. Das, was die Schnittstelle dann definiert, ist eine einfache Header-Datei, keine Klassendefinition.

    //header
    #ifndef DINGS_BUMS_HPP_INCLUDED
    #define DINGS_BUMS_HPP_INCLUDED
    
    #include <string>
    
    namespace blaList {
    
    void setString(std::string wert);
    
    } // namespace blaList
    
    #endif // Include-Guard
    

    Und sonst für die Zukunft:

    class turteltaube {
      static int zeug; // DEKLARAtion
    };
    
    int turteltaube::zeug; // DEFINItion
    

    Klassendefinition kann man in eine Header-Datei packen. Die Definition eines statischen Elements darf nur in maximal einer Übersetzungseinheit auftauchen. Schau in Deinem C++ Buch mal nach, ob Du etwas zur "one definition rule" findest. Konzepte wie Deklaration/Definition und Übersetzungseinheit solltest Du intus haben, genauso wie diese wichtige Regel. Das steht in jedem vernünftigem C++ Buch. Solche schlauen Bücher werden Dir viel Zeit sparen!



  • Mein Ziel war es einen universelle Liste bereitzustellen in der alle Klassen bzw. die Objekte von der Klasse darauf zugreifen können.
    Da ist mir eine Klasse mit statischen Werten eingefallen.

    @krümelkacker:

    #include <list>
    
    namespace bla {
    	 std::list<std::string> liste;
    	 void setWerte(std::string wert);
    }
    
    void bla::setWerte(std::string wert){
    	liste.push_front(wert);
    }
    void bla::getWert(){
    	std::string wert = liste.pop_front(); //wird hier auch das Element gelöscht??
            return wert; 
    }
    

    würde dies ausreichen, für das oben genannte Problem?



  • Beobachter01 schrieb:

    Mein Ziel war es einen universelle Liste bereitzustellen in der alle Klassen bzw. die Objekte von der Klasse darauf zugreifen können.

    Zweck?



  • Zweck ist nun mit einem Scheduler einzelne Objekte zu managen und auf die Daten die sie in diese Liste hinterlegen zuzugreifen!



  • Da würde sich ggf. auch ein Singleton empfehlen.


Anmelden zum Antworten