unaufgelöste externe Symbole - weiß nicht woher
-
Hi zusammen!
Schon voller Freude, dass mein Programm endlich fehlerfrei kompiliert wird, habe ich nun folgendes Problem beim Linken:
1>life.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: static enum Life::PATTERN Life::pattern" (?pattern@Life@@1W4PATTERN@1@A)". 1>pattern.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""protected: static enum Life::PATTERN Life::pattern" (?pattern@Life@@1W4PATTERN@1@A)".Kurz zum Aufbau:
Ich habe eine Basisklasse "Life" und davon eine abgeleitete Klasse "Pattern".
In der Klasse "Pattern" will ich ohne Instanz der Basisklasse auf gewisse Dinge in der Basisklasse zugreifen können, daher habe ich diese als static deklariert.Der zusammengekürzte Code, der relevant sein dürfte:
life.h
class Life { public: enum MODE { /*...*/ }; enum PATTERN { /*...*/ }; protected: static PATTERN pattern; };pattern.cpp
void Pattern::loadPatternToVec(std::vector<std::vector<bool>> &f) { //mode wurde in der Basisklasse deklariert, PT_BLINKER befindet sich in enum PATTERN if(pattern==PT_BLINKER) { /*...*/ } /*...*/ }Das sollte ausreichen, hoffe ich. Was mir noch etwas Kopfzerbrechen bereitet im Moment -> Ohne static (und dann natürlich mit einer Instanz der Basisklasse), bekomme ich beim Kompilieren schon den Fehler, dass ich auf die Objekte, die protected sind, nicht zugreifen kann?!
EDIT: Wenn ich die protected Objekte public mache, funktioniert alles! Allerdings will ich das nicht.
Ich hoffe, mir kann da wer helfen.
Grüße,
Langi
-
Du brauchst noch irgendwo ein
Life::PATTERN LIFE::pattern (= ...) ;Deine anderen Probleme versteh ich nicht ganz. Zeig vielelicht mal ein Beispiel, dass nicht so funktioniert wie du möchtest.
-
So, jetzt ists mal wieder so weit, dass ich komplett auf der Leitung stehe. Was meinst du mit "irgendwo"? Ich soll dem Life::pattern irgendwo einen Wert zuweisen?
Ich habe eigentlich kein anderes Problem, sondern nur eine Alternative, die auch nicht funktioniert

class Life { protected: PATTERN pattern; };void Pattern::loadPatternToVec(std::vector<std::vector<bool>> &f) { Life l; if(l.pattern) { /*...*/ } }Daraus resultiert folgende Fehlermeldung:
error C2248: "Life::pattern": Kein Zugriff auf private Member, dessen Deklaration in der Life-Klasse erfolgte. 1> c:\entwicklung\life.h(46): Siehe Deklaration von 'Life::pattern' 1> c:\entwicklung\life.h(14): Siehe Deklaration von 'Life'
-
Das
static PATTERN pattern;in der Klassendefinition ist keine Definition von
pattern, sondern nur eine Deklaration. Daher musst du irgendwo die Variable (z.B. in life.cpp) noch definieren. Sonst meckert der Linker, dass es das pattern gar nicht gibt.Auf protected Member können erbende Klassen über einen Zeiger oder eine Referenz einer abgeleiteten Klasse zugreifen. Also geht nur
void Pattern::loadPatternToVec(std::vector<std::vector<bool>> &f) { Pattern l; if(l.pattern) { /*...*/ } }Willst du nicht vielleicht aber eigentlich
void Pattern::loadPatternToVec(std::vector<std::vector<bool>> &f) { if(this->pattern) { /*...*/ } // oder einfach if(pattern) }?
-
In der Header Datei darfst du nur Integer Konstanten deklarieren, die Definition erfolgt in der Implementationsdatei (.cpp).
Header Datei
class MyClass { static const double SomeConst; };Implementationsdatei
#include "MyClass.h" static MyClass::SomeConst = 123.45;
-
Ahhh, jetzt hab ichs verstanden

Ich habs jetzt über den this-Zeiger gelöst. Ist zwar immer noch nicht 100%ig so wie ichs will, aber diese Frage ist damit zumindest gelöst. Danke!