In C ++ bezieht sich ein Objekt auf sich selbst über this
.
Aber wie bezieht sich eine Instanz einer inneren Klasse auf die Instanz ihrer einschließenden Klasse?
%Vor%BEARBEITEN
Mein Verständnis davon, wie nicht statische innere Klassen funktionieren, besteht darin, dass Bear
auf die Mitglieder von Zoo
zugreifen kann und daher einen impliziten Zeiger auf Zoo
hat. Ich möchte in diesem Fall nicht auf die Mitglieder zugreifen; Ich versuche, diesen impliziten Zeiger zu bekommen.
Im Gegensatz zu Java haben innere Klassen in C ++ nicht einen impliziten Verweis auf eine Instanz ihrer einschließenden Klasse.
Sie können dies simulieren, indem Sie eine Instanz übergeben. Es gibt zwei Möglichkeiten:
übergeben Sie die Methode:
%Vor%übergibt an den Konstruktor:
%Vor%Eine innere Klasse hat Zugriff auf alle Mitglieder der äußeren Klasse, hat jedoch keinen impliziten Verweis auf eine Elternklasseninstanz.
Um dein modifiziertes Q zu beantworten:
Nein, Sie können nicht auf diesen impliziten Zeiger zugreifen. Ich glaube, man kann dies in Java tun, aber nicht in C ++.
Sie müssen das äußere Klassenobjekt explizit durch Konstruktor oder eine andere Funktion übergeben, um dies zu erreichen.
Technisch nach C ++ 03 Standard (sec 11.8.1) hat eine geschachtelte Klasse keinen speziellen Zugriff auf ihre einschließende Klasse.
Aber es gibt auch diesen Standardfehler: openstd.org/jtc1/sc22/wg21/docs/cwg_defects.html#45 Nicht sicher, ob das geschlossen ist.
Sie können auf die äußere Klasseninstanz von einer inneren Klasseninstanz zugreifen, indem Sie offsetof verwenden.
Dies hat keinen Overhead im Vergleich zur Zeiger- / Referenzlösung.
Es ist ein bisschen schmutzig, aber es macht die Arbeit erledigt
Zum Beispiel:
P.S.
offsetof macht einige Annahmen über den Typ. In C ++ 98 muss der Typ ein POD sein und in C ++ 11 muss der Typ "Standardlayout" sein.
Hier ist eine Referenz: Ссылка
Es gibt keinen eingebauten Mechanismus, um dies zu erreichen. Sie müssen den Zeiger selbst bereitstellen, über Konstruktor oder eine Art von SetParent-Funktion.
Der C ++ Standard sagt (Abschnitt 11.8.1 [class.access.nest]):
Die Mitglieder einer geschachtelten Klasse haben keine spezieller Zugang zu Mitgliedern eines umschließende Klasse, noch zu Klassen oder Funktionen, die Freundschaft gewährt haben zu einer einschließenden Klasse; das Übliche Zugangsregeln (Ziffer 11) sein gehorcht. Die Mitglieder eines umschließenden Klasse haben keinen besonderen Zugang zu Mitglieder einer geschachtelten Klasse ; das Übliche Zugangsregeln (Ziffer 11) sein gehorcht.
(Betonung von mir).
Dies bedeutet, dass zwischen der geschachtelten und der umschließenden Klasse keine spezielle Beziehung besteht.
Tags und Links c++ inner-classes this