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