Zugriff der geschachtelten Klasse auf private Datenelemente der umschließenden Klasse

8

Ich habe Probleme beim Implementieren einer geschachtelten Klasse, deren Konstruktor mit einigen privaten Datenmitgliedern der umschließenden Klasse initialisiert wird.

Beispiel:

%Vor%

Ich bekomme einen invalid use of non-static data member Fehler. Gibt es etwas, das mir fehlt, wenn es um den geschachtelten Klassenzugriff auf die Mitglieder der umschließenden Klasse geht?

    
trikker 22.10.2009, 03:20
quelle

3 Antworten

19

Member x und y sind nicht statische Datenelemente von Enclosing , was bedeutet, dass sie nur innerhalb eines konkreten Objekts von Enclosing class existieren. Ohne ein konkretes Objekt existieren weder x noch y . In der Zwischenzeit versuchen Sie, auf x und y ohne ein Objekt zu verweisen. Das kann nicht gemacht werden, was der Compiler Ihnen zu sagen versucht.

Wenn Sie die Mitglieder Inner::foo und Inner::bar von x und y initialisieren möchten, müssen Sie ein konkretes Objekt vom Typ Enclosing in den Konstruktor Inner s übergeben. Zum Beispiel

%Vor%

Zusätzliche Anmerkung: in der ursprünglichen C ++ 98 hat die innere Klasse keine besonderen Privilegien ist Zugriff auf die äußere Klasse. Mit dem C ++ 98-Compiler müssten Sie entweder der inneren Klasse die notwendigen Privilegien (Freundschaft) geben oder die Mitglieder x und y als öffentlich zugänglich machen. Diese Situation wurde jedoch in C ++ 98 als Fehler klassifiziert und es wurde beschlossen, dass innere Klassen vollen Zugriff auf äußere Klassenmitglieder (sogar private) haben sollten. Ob Sie in Bezug auf Zugriffsberechtigungen etwas Zusätzliches tun müssen, hängt von Ihrem Compiler ab.

    
AnT 22.10.2009, 05:15
quelle
8

Das Problem mit Ihrem Code ist nicht sichtbar , wie angegeben durch AndreyT , aber das Eine Instanz der Klasse Inner ist nicht an eine konkrete Instanz der Klasse Enclosing gebunden. Mit anderen Worten: Beim Erstellen eines Inner kann der Compiler nicht wissen, welches Objekt die Werte x und y übernehmen soll.

Sie müssen dem Konstruktor der Klasse Enclosing explizit eine Instanz der Klasse Inner bereitstellen:

%Vor%     
cdiggins 22.10.2009 03:49
quelle
0

geschachtelte Klasse kann nicht auf privet Datenelement des einschließenden class.compiler zugreifen, zeigt einen Fehler, wenn wir versuchen, auf privet Element der einschließenden Klasse zuzugreifen, kann es nur auf das öffentliche Datenelement der einschließenden Klasse zugreifen .....

    
pankaj singh 17.04.2010 20:27
quelle

Tags und Links