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";
Este error se produce cuando compilo con la clase Outer :: Inner 'no tiene un miembro llamado' var '
c++
inner-classes
kal
fuente
fuente
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 la clase externa.
fuente
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.
fuente
var no es 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 la externa, o var es pública, si uno sigue estrictamente el estándar C ++.
Algunos compiladores tratan a las clases internas como amigas de las externas, pero es posible que 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 a su clase adjunta. A menos que use punteros, referencias o nombres de objeto explícitos, las declaraciones en una clase anidada solo pueden usar construcciones visibles, incluyendo nombres de tipo, miembros estáticos y enumeradores de la clase adjunta y variables globales.
Las funciones de los miembros de una clase anidada siguen las reglas de acceso regulares y no tienen privilegios de acceso especiales 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 ".
fuente
friend
opublic
. ¿A quién le importa si IBM estaba equivocado / desactualizado, en el pasado, en un enlace muerto? Esta respuesta ya estaba desactualizada 3 años antes de su publicación.En primer lugar, está intentando acceder a miembros no estáticos
var
fuera de la clase que no está permitido en C ++.La respuesta de Mark es correcta.
Entonces, puede hacer dos cosas, declarar
var
comostatic
o usar una referencia de una instancia de la clase externa para acceder a 'var' (porque una clase o función amiga también necesita una referencia para acceder a datos privados).Var estática
Cambie
var
astatic
Si no deseavar
estar asociado con las instancias de la clase.Salida- var: 1
Var no estática
La referencia de un objeto debe acceder a cualquier variable miembro no estática.
Salida- var: 1
Editar: los enlaces externos son enlaces a mi blog.
fuente