Bitte beachten Sie die folgende Beispielcode:Die Memberfunktion der geschachtelten Klasse kann nicht auf die Funktion der umschließenden Klasse zugreifen. Warum?
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Innerhalb der Klasse A & B Implementierung:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Die Compiler-Flags der Aufruf von foo() innerhalb der Methode foobar(). Zuvor hatte ich foo() als private Member-Funktion der Klasse A, änderte es aber in die Öffentlichkeit, wobei ich annahm, dass die Funktion von B es nicht sehen kann. Natürlich hat es nicht geholfen. Ich versuche, die von A's Methode zur Verfügung gestellte Funktionalität wiederzuverwenden. Warum erlaubt der Compiler diesen Funktionsaufruf nicht? Wie ich es sehe, sind sie Teil derselben umschließenden Klasse (A). Ich dachte, dass das Problem mit der Barrierefreiheit für Klassenverantwortliche für das Einschließen von Klassen in C++ - Standards gelöst wurde.
Wie kann ich erreichen, was ich versuche, ohne die gleiche Methode (foo()) für B zu schreiben, die B in A geschachtelt hält?
Ich verwende VC++ Compiler ver-9 (Visual Studio 2008). Danke für Ihre Hilfe.
+1, nur ein Nitpick - "Elternteil" ist wahrscheinlich nicht der beste Name für Member-Variable hier - leichte Verwirrung mit Vererbung. –
Ich wollte nur erwähnen, dass es einen sehr guten Entwurfsgrund für die verschachtelte Klasse B gab, einen Verweis auf Klasse A zu haben. – manifest
Vielen Dank für die Erklärung mit Beispiel. Der C++ - Standard 11.8, von dem ich vermutete, dass er sich geändert hat, spricht über den Klassenzugriff von verschachtelten Klassen. Ich weiß, dass gcc den Zugriff durch geschachtelte Klasse erlaubt (ich bin mir sicher), aber MS VC Compiler nicht. Hmm, interessant. – Rahul