"undefined refence to" bei STL-list
-
Im Grund möchte ich einfach nur, dass meine Klasse sich selber um die Verwaltung aller Objekte von sich selbst kümmert. Dazu möchte ich per STL-Funktion list eine Liste als static-Element der Klasse erzeugen. Im Konstruktor soll dabei das gerade erstellte Element direkt in diese Liste eingefügt werden.
Dazu habe ich direkt eine Frage: Wie kann ich direkt am Start eines Programms ein list-Element erzeugen und in dem static-Element speichern, ohne speziell new in einer Initialisierung-Funktion aufrufen zu müssen? Wenn möglich würde ich das direkt bei der Deklaration machen wollen. Allerdings habe ich auch schon häufig gehört, new sollte man eh vermeiden und lieber auf eigene Verwaltung der STL vertrauen. Andererseits habe ich auch gehört, dass man new benutzen sollte, weil Elemente ansonsten auf dem Stack abgelegt werden und dieser nur wenig Speicher hat (typisch 1 MB). Leider reicht mein Wissen um C++ nicht aus, um diese beiden Aussagen beurteilen zu können. Kann mir dort jemand eine Erklärung geben, wie sich das ganze nun verhält oder mir einen Tipp geben, wo ich mir die Information selber beschaffen kann? (Link, oder auch ein Buch wenn es sein muss. ^^)Mein eigentliches Problem ist aber folgendes: Ich bekomme den Fehler undefined reference to `Wurst::wurst' bei meinem Code. Problematisch ist dabei folgende Zeile exakt: list <Wurst>::iterator beginn = wurst.begin(); - Weiß jemand da Rat? Ich könnte wirklich einen Tipp gebrauchen, weswegen mein Compiler mir sagt, dass ich da Müll geschrieben habe. ^^
#include <iostream> #include <list> #include <string> using namespace std; class Wurst { public: string name; // Geht nicht: // static list<Wurst> wurst = new list<Wurst>; static list<Wurst> wurst; Wurst(string name) { this->name = name; } static void gebeWurstAus() { // Geht nicht, sagt " undefined reference to `Wurst::wurst' " list <Wurst>::iterator beginn = wurst.begin(); list <Wurst>::iterator ende = wurst.end(); while (beginn != ende) { cout << beginn->name << endl; ++beginn; } } }; int main() { cout << "Test 1" << endl; Wurst::gebeWurstAus(); cout << "Test 2" << endl; Wurst * wurst = new Wurst("Bockwurst"); Wurst::gebeWurstAus(); cout << "Test Ende" << endl; return 0; }Gruß, Nova900
-
Schreibe mal direkt nach der Klassendefinition
std::list<Wurst> Wurst::wurst;Statische Member müssen auf diese Weise initialisiert werden.
-
hallo erstmal
die elemente die in den stl-containern (std::list, std::vector, std::deque etc.) drin sind, werden schon mit new[] angelegt, also auf dem heap (genauer genommen werden sie mit dem allocator angelegt).
dein problem ist, dass du versuchst auf eine variable zuzugreifen die nicht definiert ist:
extern int foo; // Deklaration ohne zugehörige Definition -> Linkerfehler struct bar { static list<Wurst> wurst; // Wieder Deklaration ohne Definition }; int foo2; // Deklaration und Definition in einem struct bar2 { static list<Wurst> wurst; // Deklaration }; list<Wurst> bar2::wurst; // ...und die dazugehörige Definition mit dem Standardkonstruktor
-
Vielen Dank ihr beide, das war die Lösung.
