Wie bezieht man sich auf umschließende Instanz von C ++ innere Klasse?

7

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.

    
Tony the Pony 01.06.2011, 08:21
quelle

7 Antworten

13

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%     
BЈовић 01.06.2011, 08:25
quelle
6

Innere Klassen sind nicht besonders und haben keine Verbindung zu ihrer eingebauten äußeren Klasse. Wenn Sie auf die äußere Klasse zugreifen möchten, übergeben Sie einen Zeiger oder eine Referenz wie bei jeder anderen Klasse.

    
Puppy 01.06.2011 08:28
quelle
5

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.

    
Alok Save 01.06.2011 08:27
quelle
3

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:

%Vor%

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: Ссылка

    
Tal Zion 22.03.2013 15:15
quelle
2

Es gibt keinen eingebauten Mechanismus, um dies zu erreichen. Sie müssen den Zeiger selbst bereitstellen, über Konstruktor oder eine Art von SetParent-Funktion.

    
Dialecticus 01.06.2011 08:26
quelle
2

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.

    
Tamás Szelei 01.06.2011 08:38
quelle
1

Es gibt keine implizit erstellte Instanz der einschließenden Klasse beim Erstellen einer Instanz der geschachtelten Klasse. Es muss manuell gemacht werden.

    
devil 01.06.2011 08:39
quelle

Tags und Links