Geschachtelte Klasse member-Funktion nicht zugreifen können, die Funktion der umschließenden Klasse. Warum?
Siehe Beispiel-code unten:
class A
{
private:
class B
{
public:
foobar();
};
public:
foo();
bar();
};
Innerhalb Klasse A & B Umsetzung:
A::foo()
{
//do something
}
A::bar()
{
//some code
foo();
//more code
}
A::B::foobar()
{
//some code
foo(); //<<compiler doesn't like this
}
Den compiler-flags der Aufruf von foo() in der Methode foobar(). Früher hatte ich foo() als private-member-Funktion der Klasse A, aber geändert, um der öffentlichkeit unter der Annahme, dass B die Funktion kann es nicht sehen. Natürlich, es hat nicht geholfen. Ich bin versucht zu re-verwenden Sie die Funktionen Einer Methode. Warum macht das nicht der compiler diese Funktion aufrufen? Wie ich es sehe, Sie sind Teil der gleichen umgebenden Klasse (A). Ich dachte, das Thema Barrierefreiheit für geschachtelte Klasse meebers für umschließenden Klasse in C++ - standards gelöst wurde.
Wie kann ich erreichen, was ich versuche zu tun, ohne das neu-schreiben der gleichen Methode (foo()) für B, die halten B verschachtelt ist?
Bin ich mit VC++ compiler ver-9 (Visual Studio 2008). Danke für Eure Hilfe.
InformationsquelleAutor der Frage Rahul | 2010-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
foo()
ist eine nicht-statische member-Funktion vonA
und Sie versuchen, es zu nennen, ohne eine Instanz.Die geschachtelte Klasse
B
ist eine separate Klasse, die nur einige Zugriffsrechte und muss keine speziellen Kenntnisse über die vorhandenen Instanzen vonA
.Wenn
B
benötigt Zugriff auf eineA
müssen Sie ihm eine Referenz, z.B.:InformationsquelleAutor der Antwort Georg Fritzsche
Dies ist ein automagic, wenn auch eventuell nonportable trick (funktioniert auf VC++ seit 6.0). Klasse B ein Mitglied der Klasse A für diese zu arbeiten.
InformationsquelleAutor der Antwort Igor Zevaka
Wenn Sie wollen, um die Wiederverwendung von Funktionalität aus, dann sollten Sie Erben von Einer nicht-nest-B drin.
InformationsquelleAutor der Antwort Gary
Im Grunde das, was Georg Fritzsche sagte
Wenn Sie kommentieren Sie die Standard-B-Konstruktor würden Sie eine Fehlermeldung erhalten,
InformationsquelleAutor der Antwort enthusiasticgeek