programming oriented concepts c++ oop

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?

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.