Frage zu Klassen (static)
-
Habe das verstanden mit dem Elefanten und so ...
neu eingehackt://Header Datei class MyString { ... static MyStr* _LOCALE; static void DefLocale(char* Welche); } // .cpp void MyString::DefLocale(char* Welche) { _LOCALE = new MyString(Welche); // Den Rest erledigt der Konstruktor } // Aufruf der static Funktion um die Locale zu definieren erfolgt, ohne dass // vorher ein Objekt der Klasse MyString erzeugt wurde, stets zu Beginn des // Programms DefLocale("dm_DM@euro");
Jetzt wird kompiliert, aber beim verlinken der Objektdateien gigts folgende Fehlermeldung: "Undefined reference to MyString::_LOCALE"
und zwar für jede Stelle an der ich _LOCALE verwende.Beispiel:if(setlocale(LC_ALL, _LOCALE->readMe()).... // readMe() ist ne Zugriffsfunktion auf den gespeicherten Begriff
... und Danke für die rege Beteiligung und Hilfe
arni
-
um ehrlich zu sein empfehle ich dir nochmal das C++ Buch zur hand zu nehmen und alles genau nachzuschlagen. Weil in dem Code *oben deut* sind nicht nur Denkfehler sondern auch erhebliche Verständnislücken. imho.
Maybe denkst dir nu "eh was das fürn arsch" ... aber ich denke das es dir sicher mehr von nutzen wär bissl äps zu lesen wie wenn dir jemand ne musterlösung postet.
-
Für einfach die Zeile
Es muß
static MyString * _LOCALE;
heißen
Außerdem mußt Du für das Element auch noch Speicher reservieren, dazu mußt Du im cpp-File die Zeile
MyString::MyString * _LOCALE;
einfügen.
-
Jester schrieb:
Außerdem mußt Du für das Element auch noch Speicher reservieren, dazu mußt Du im cpp-File die Zeile
MyString::MyString * _LOCALE;
einfügen.
du solltest meinen ratschlag auch warnehmen wenn du das glaubst was du da schreibst. !!!
-
Könntest Du die Problematik kurz erläutern? Ich seh's grad irgendwie nicht, ansonsten würd ich Dich bitten Dich mal nicht im Ton zu vergreifen.
-
Die Zeile muß
MyString * Mystring::_LOCALE; heißen...
ist das ein Grund hier gleich dumm angemacht zu werden?
-
eigentlich ist mein post selbsterklärend.
p.s. bist du dir wirklich sicher das diese zeile .. speicher reserviert ..
-
Was tut sie denn Deiner Meinung nach?
-
Ihr habt beide recht, meint aber völlig unterschiedliche Sachen. Die Zeile fordert Speicher für einen Pointer an, und weil der Pointer später (in der Funktion DefLocale) initialisiert wird, reicht das auch - das ist das, was Jester meint. Die Zeile fordert aber keinen Speicher für ein Objekt an - das ist das, was 1ntrud0r meint.
-
siehe oben
-
Ahhhh, jetzt versteh ich, warum der hier so abgeht...
aber ich hab rechter! :p
-
@1ntrudor
nee, ich denke nicht 'was für ein arsch', eher 'ich freue mich, dass ich hier immer neue Denkansätze und und Tips kriege'. Und du hast ja Recht (Habe nochmal nachgelesen)
"Es ist ein verbreiteter Fehler, die Definition der statischen Elementvariablen von Klassen zu vergessen. Achten sie darauf, dass ihnen das nicht passiert! Natürlich kommt es trotzdem irgendwann vor und der Linker reagiert daraufhin mit einer Fehlermeldung wie der folgenden:
'undefined reference to KlassenName::VariablenName' "
(O-Ton Jesse Liberty in 'Jetzt lerne ich C++')War leider ne Weile her, dass ich dies Kapitel durchgearbeitet habe und habe heute das erste mal ne static Variable wirklich verwendet.
Und bin prompt reingefallen ...Jester hat mich mit seinen Beitrag auf genau die richtige Buchseite 'geführt'.
Die Definition muss natürlich etwas anders gestellt werden, hat mich der Compiler aber gleich draufgeschubst.Es ist auch alles irgendwie sehr logisch:
für die Elementvariablen wird bei der Instantiierung des Objekts automatisch Speicher reserviert. Eine Static-Variable gehört aber nicht zum 'Objekt' sondern zur Klasse, steht allen Objekten zur Verfügung und existiert genau einmal. Daher muss explicit Der Speicher für die Static-Variable in der .cpp angefordert werden, weil es nämlich niemand automatisch macht.Also die Lektion habe ich gelernt.
Danke für eure Hilfe, das Thema werde ich so schnell nicht mehr vergessen.PS. meine Stringklasse erledigt die Speicheranforderung und -freigabe völlig selbstständig und Fehlerfrei.Vielleicht hat das auch zu der Vermutung geführt, dass ich allgemeine Grundlagen noch nicht verstanden habe, aber meine Operatoren und Konstruktoren kümmern sich wirklich um diese Dinge.
Vielen Dank für eure Hilfe.
arni