una que privada otra objeto nombre llevan internas dentro crear clases clase anonimas abstractas c++ inner-classes

c++ - que - ¿Pueden las clases internas acceder a variables privadas?



crear un objeto de una clase dentro de otra clase (4)

class Outer { class Inner { public: Inner() {} void func() ; }; private: static const char* const MYCONST; int var; }; void Outer::Inner::func() { var = 1; } const char* const Outer::MYCONST = "myconst";

Esto se equivoca cuando compilo con la clase Outer :: Inner ''no tiene ningún miembro llamado `var''


Todo lo que sea parte de Outer debe tener acceso a todos los miembros de Outer, públicos o privados.

Editar: su compilador es correcto, var no es miembro de Inner. Pero si tiene una referencia o un puntero a una instancia de Outer, podría acceder a eso.


Una clase interna es amiga de la clase en la que está definida.
Entonces sí; un objeto de tipo Outer::Inner puede acceder a la variable miembro var de un objeto de tipo Outer .

Sin embargo, a diferencia de Java, no hay correlación entre un objeto de tipo Outer::Inner y un objeto de la clase padre. Tienes que hacer la relación padre-hijo manualmente.

#include <string> #include <iostream> class Outer { class Inner { public: Inner(Outer& x): parent(x) {} void func() { std::string a = "myconst1"; std::cout << parent.var << std::endl; if (a == MYCONST) { std::cout << "string same" << std::endl; } else { std::cout << "string not same" << std::endl; } } private: Outer& parent; }; public: Outer() :i(*this) ,var(4) {} Outer(Outer& other) :i(other) ,var(22) {} void func() { i.func(); } private: static const char* const MYCONST; Inner i; int var; }; const char* const Outer::MYCONST = "myconst"; int main() { Outer o1; Outer o2(o1); o1.func(); o2.func(); }


Una clase interna tiene acceso a todos los miembros de la clase externa, pero no tiene una referencia implícita a una instancia de clase padre (a diferencia de algunas rarezas con Java). Entonces, si pasa una referencia a la clase externa a la clase interna, puede hacer referencia a cualquier cosa en la instancia de clase externa.


var no es un miembro de la clase interna.

Para acceder a var, se debe usar un puntero o referencia a una instancia de clase externa. por ejemplo, pOuter-> var funcionará si la clase interna es amiga de outer, o, var es public, si se sigue estrictamente el estándar de C ++.

Algunos compiladores tratan las clases internas como el amigo de lo externo, pero otros no. Consulte este documento para el compilador de IBM :

"Una clase anidada se declara dentro del alcance de otra clase. El nombre de una clase anidada es local para su clase adjunta. A menos que use punteros, referencias o nombres de objetos explícitos, las declaraciones en una clase anidada solo pueden usar construcciones visibles, incluidas escriba nombres, miembros estáticos y enumeradores de la clase adjunta y variables globales.

Las funciones miembro de una clase anidada siguen reglas de acceso regulares y no tienen privilegios especiales de acceso para los miembros de sus clases adjuntas. Las funciones miembro de la clase adjunta no tienen acceso especial a los miembros de una clase anidada ".