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?
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
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.
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:
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 .....