oriented - Accesibilidad de clases anidadas en C++
object oriented programming c++ pdf (4)
Pregunta 1> ¿Es cierto que OutSideClass SOLO puede acceder a miembros públicos de InSideClass?
Sí
Pregunta 2> ¿Es cierto que InSideClass puede acceder a todos los miembros de OutSideClass?
No, en C ++ 03. Sí, en C ++ 11.
El texto estándar es muy claro al respecto:
El estándar de C ++ (2003) dice en $ 11.8 / 1 [class.access.nest],
Los miembros de una clase anidada no tienen acceso especial a los miembros de una clase adjunta , ni a las clases o funciones que han otorgado amistad a una clase encerradora; Las reglas de acceso habituales (cláusula 11) deberán ser obedecidas. Los miembros de una clase adjunta no tienen acceso especial a los miembros de una clase anidada; Las reglas de acceso habituales (cláusula 11) deberán ser obedecidas.
Sin embargo, la cotización estándar tiene un defecto. Dice que las clases anidadas no tienen acceso a los miembros privados de la clase adjunta. Pero en C ++ 11, se corrigió: en C ++ 11, las clases anidadas tienen acceso a miembros privados de la clase adjunta (aunque la clase adjunta todavía no tiene acceso a miembros privados de las clases anidadas).
Ver este informe de defectos:
Dado el siguiente código sin considerar la amistad entre dos clases:
class OutSideClass
{
...
public:
int i_pub;
protected:
int i_pro;
private:
int i_pri;
class InSideClass
{
...
public:
int j_pub;
protected:
int j_pro;
private:
int j_pri;
};
};
Pregunta 1> ¿Es cierto que OutSideClass SOLO puede acceder a miembros públicos de InSideClass?
Pregunta 2> ¿Es cierto que InSideClass puede acceder a todos los miembros de OutSideClass?
Por favor corríjame si mi entendimiento no es correcto.
Como señala @Nawaz, en C ++ 03, las clases anidadas no tienen derechos de acceso especiales para los miembros de la clase adjunta. Sin embargo, es fácil evitar esta limitación declarando a la clase anidada como un amigo.
class OutSideClass
{
...
class InSideClass
{
...
};
friend class InSideClass;
};
No hay privilegios de acceso especiales para la clase anidada a una clase adjunta.
Todo lo que hacen las clases anidadas en C ++ es poner la clase interna en el espacio de nombres de la clase externa. Para instanciar una instancia de InSideClass desde una función miembro de OutSideClass, simplemente lo haría
InSideClass *instance = new InSideClass();
Si InsideClass fuera pública y quisiera crear una instancia de InSideClass desde una función que no es miembro de OutSideClass, escribiría:
OutSideClass::InSideClass *instance = new OutSideClass::InSideClass();
InSideClass y OutSideClass son por lo demás completamente separados, a diferencia de otros lenguajes como Java.