[C++] ¿Pueden las clases internas acceder a variables privadas?


Answers

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.

Question
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'




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 ".