Innere Klassen greifen auf private Variablen in C zu
In C haben innere Klassen die einzigartige Fähigkeit, auf private Mitglieder der umschließenden Klasse zuzugreifen. Betrachten Sie das folgende Beispiel:
class Outer { class Inner { public: Inner() {} void func(); }; private: static const char* const MYCONST; int var; };
In diesem Beispiel ist die Inner-Klasse innerhalb der Outer-Klasse definiert. Gemäß den herkömmlichen Bereichsregeln sollte die var-Mitgliedsvariable von Outer für Inner nicht zugänglich sein. In C sind innere Klassen jedoch von Natur aus Freunde ihrer umschließenden Klasse.
Daher können Objekte vom Typ Outer::Inner auf die privaten Mitgliedsvariablen von Outer zugreifen. Es ist jedoch wichtig zu beachten, dass dieser Zugriff nur im Rahmen der inneren Klasse gewährt wird.
Um dieses Konzept weiter zu veranschaulichen, ändern wir die func()-Methode der inneren Klasse wie folgt:
void Outer::Inner::func() { var = 1; }
Wenn wir nun versuchen, diesen Code zu kompilieren, wird eine Fehlermeldung angezeigt, die besagt, dass „class Outer::Inner“ kein Mitglied mit dem Namen „var“ hat. Dies liegt daran, dass innere Klassen zwar Zugriff auf private Mitglieder haben, aber keine Mitgliedsbeziehung mit der umschließenden Klasse erben.
Um eine ordnungsgemäße Mitgliedsbeziehung innerhalb der inneren Klasse herzustellen, müssen wir manuell einen Verweis auf erstellen umschließende Klasse, wie im folgenden Beispiel gezeigt:
class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::cout << parent.var << std::endl; } private: Outer& parent; }; public: Outer() : i(*this), var(4) {} void func() { i.func(); } private: Inner i; int var; }; int main() { Outer o; o.func(); }
In diesem Beispiel verwendet der Konstruktor der inneren Klasse einen Verweis auf die äußere Klasse als Argument. Dadurch können Objekte vom Typ Outer::Inner über die übergeordnete Referenz auf die privaten Mitglieder von Outer zugreifen.
Das obige ist der detaillierte Inhalt vonWie können innere Klassen in C auf private Mitglieder ihrer umschließenden Klasse zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!