Inner Klasse: Zugriff auf private
-
Abend,
sagen wir ich habe eine inner Klasse:
class Outer{ public: class Inner { private: Outer* mOuter; public: Inner (Outer* outer); }; private: int* mFoo;Und im .cpp file:
Outer::Inner::Inner(Outer* outer) : mOuter(outer) { mOuter->mFoo = 0; // Kompiliert! Wieso kann ich auf mFoo zugreifen? Ist doch private }Wieso kann ich im Ctor von Inner auf mFoo von Outer zugreifen, obwohl es private ist?

-
Alles innerhalb einer Klasse hat Zugriff auf private Member derselben. Dazu gehören auch Klassen.
-
Nachtschatten22 schrieb:
Wieso kann ich im Ctor von Inner auf mFoo von Outer zugreifen, obwohl es private ist?

Bug, verwende einen anderen Compiler.
-
Das Thema war "strittig":
Siehe
http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45
Absatz "Proposed Resolution"bzw. den kommenden Standard:
n3090 schrieb:
11.8 Nested classes
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing class have no special access to members of a nested class; the usual access rules (Clause 11) shall be obeyed.
MSVC, GCC und Comeau setzen das anscheinend auch schon länger so um.
@314159265358979: In C++ 98 definitiv nicht (ist sogar ein explizites Beispiel drinnen dass es verboten ist)

-
hustbaer schrieb:
n3090 schrieb:
11.8 Nested classes
1 A nested class is a member and as such has the same access rights as any other member. The members of an enclosing class have no special access to members of a nested class; the usual access rules (Clause 11) shall be obeyed.
MSVC, GCC und Comeau setzen das anscheinend auch schon länger so um.
Versteh ich nicht. Wenn sie es umsetzen wuerden, wuerde der Zugriff doch gerade eben NICHT gehen?

Ich benutzte VS 2010.
-
Schau dir den ersten Satz an. Der zweite Satz ist für den umgekehrten Fall umgebende Klasse -> innere Klasse.
-
Michael E. schrieb:
Schau dir den ersten Satz an. Der zweite Satz ist für den umgekehrten Fall umgebende Klasse -> innere Klasse.
Naja, aber Inner greift ja nicht direkt auf mFoo zu (wuerde ja gehen wenn mFoo statisch waere), sondern uber den Zeiger mOuter. mOuter->mFoo heisst ja dann: Ich bin Klasse Inner und greife ueber Zeiger mOuter auf den private Member mFoo zu. Das sollte doch nicht gehen?
-
Nachtschatten22 schrieb:
Michael E. schrieb:
Schau dir den ersten Satz an. Der zweite Satz ist für den umgekehrten Fall umgebende Klasse -> innere Klasse.
Naja, aber Inner greift ja nicht direkt auf mFoo zu (wuerde ja gehen wenn mFoo statisch waere), sondern uber den Zeiger mOuter. mOuter->mFoo heisst ja dann: Ich bin Klasse Inner und greife ueber Zeiger mOuter auf den private Member mFoo zu. Das sollte doch nicht gehen?
Doch. Die Klasse Inner darf auf private Member der Klasse Outer zugreifen. Das heißt, jedes Inner-Objekt hat Zugriff auf die Innereien von jedem Outer-Objekt.
-
Edit: Unfug