Statische Klassenvariable und Linkerfehler
-
Ich hab da wohl einen Denkfehler:
// foo.h #include <vector> class Foo { public: static std::vector<double> machwas(); private: static std::vector<double> moo; }; // foo.c #include "foo.h" Foo::std::vector<double> Foo::machwas(){ moo.push_back(3); return moo; }Wieso bekomme ich bei moo einen Linkerfehler bezüglich unaufgelöstes externes symbol?
-
Keine ahnung ob es ein Kopierfehler ist, aber hier hast du ein Syntaxfehler drinne.
Foo:std::vectorSollte doch eher
Foo::std::vectorheißen oder nicht?
-
Das ist ein Fehler hier, nicht des Codes

Ist editiert, Problem besteht weiterhin

-
muss das in der cpp datei nicht so heissen:
#include "Foo.h" static std::vector<double> Foo::machwas() { this->moo.push_back(3.0); return moo; }
-
Du musst wie jede Statische Variable erst initialisieren.
class Foo { public: static std::vector<double> machwas(); private: static std::vector<double> moo; }; std::vector<double> Foo::moo; std::vector<double> Foo::machwas() { moo.push_back(3); return moo; }Ist ungetestet, also bitte nicht hauen fals es net korrekt ist

-
Skym0sh0 schrieb:
muss das in der cpp datei nicht so heissen:
#include "Foo.h" static std::vector<double> Foo::machwas() { this->moo.push_back(3.0); return moo; }this? moo ist doch statisch da kann man doch kein this anwenden.
-
Die fehlende Deklaration war in der Tat das Problem. Ich nahm irgendwie an, dass es implizit geschieht. Was soll man sonst mit einer Variablen noch anstellen?
-
Was soll man sonst mit einer Variablen noch anstellen?
Was stellst du denn sonst so mit deinen Variablen an?
-
Mit nicht initialisierten? Garnichts
-
Seikilos schrieb:
Mit nicht initialisierten? Garnichts
Eben. Der Compiler sieht dass er für die statische Variable Speicher reservieren soll und will den initialisieren, weil uninitialisierte Variablen wenig Sinn machen (mal von nichtstatischen PODs abgesehn, bevor hier wieder jemand auf Details herumreiten möchte ;)). Und bei der Suche danach wie er den initialisieren soll sucht er sich tot.
-
Und da gibt es keine default initialisierung?
-
Seikilos schrieb:
Und da gibt es keine default initialisierung?
Für nichtstatische PODs nur, wenn Du sie explizit durchführst:
int a = int(); //a wird mit 0 initialisiertansonsten steht irgendwelcher Müll drin.