Aus Klasse in Klasse auf Variable des "Parents" zugreifen?
-
Hi,
um zu verdeutlichen was ich meine, habe ich ein kleines (weniger sinnvolles) Beispiel geschrieben.
#include <iostream> #include <string> class A { public: static std::string stC; A(void) { stC = "Hallo Welt"; B cB; } ~A(void) { } private: class B { public: B(void) { std::cout << stC << std::endl; } ~B(void) { } }; }; int main(int argc, char *argv[]) { A cA; return 0; }1>Problem.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > A::stC" (?stC@A@@2V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)". 1>c:\users\klassensprecher\documents\visual studio 2010\Projects\Problem\Debug\Problem.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
Vielleicht... eh... ganz bestimmt kann mir dabei jemand helfen

Danke
-
Die statische Variable ist nur deklariert. Sie muss in einer (und nur einer!) Übersetzungseinheit definiert werden:
// A.h struct A { static int x; // Deklaration }; // A.cpp int A::x = 0; // Definition
-
Danke für deine schnelle Antwort!
Aber ich dachte, ich hätte die in Zeile 11 mit
stC = "Hallo Welt";schon definiert

Das ist in meinem Programm der Rückgabewert einer Funktion die ich innerhalb einer Methode der Klasse (hier A) aufrufe. Auf diese Funktion soll aber nicht außerhalb der Klasse zugegriffen werden, weshalb ich Probleme habe deine Antwort umzusetzen

-
Das ist nur eine Zuweisung. Die statische Variable wird nicht im Konstruktor angelegt, weil sie nicht objektgebunden ist (d.h. es gibt nur eine davon im gesamten Programm, und alle Objekte der Klasse benutzen die selbe).
Zugriffsbeschränkungen gelten wie in der Klasse deklariert; wenn du nicht willst, dass Objekte einer anderen Klasse darauf zugreifen können, musst du sie also nur private deklarieren. Bei der Initialisierung kannst du auf private Klassenfunktionen zurückgreifen:
// A.h class A { static int x; static int foo(); }; // A.cpp int A::x = A::foo(); int A::foo() { return 42; }