videos tutorial relaciones rectangulo programar programacion poo orientado orientada objetos objeto entre como clases clase c++ friend nested-class

tutorial - ¿Las clases internas en C++ son automáticamente amigos?



tutorial de clases en c++ (5)

Hasta C ++ 11 (es decir, C ++ 98 y C ++ 03)

En C ++ 98 y C ++ 03, la clase anidada no puede acceder a private miembros private y protected de la clase envolvente de forma predeterminada.

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.

Ejemplo de la norma misma:

class E { int x; class B { }; class I { B b; // error: E::B is private int y; void f(E* p, int i) { p->x = i; // error: E::x is private } }; int g(I* p) { return p->y; // error: I::y is private } };

Desde C ++ 11

La restricción anterior ha sido eliminada desde C ++ 11. Ahora las clases anidadas pueden acceder a los miembros private y protected de la clase adjunta:

class E { int x; class B { }; class I { B b; // ok: even though E::B is private int y; void f(E* p, int i) { p->x = i; // ok: even though E::x is private } }; int g(I* p) { return p->y; // ok: even though I::y is private } };

Espero que ayude.

Si defino una clase interna en C ++, ¿es automáticamente un amigo de la clase que la contiene? Por ejemplo, es esto legal:

class Outer { public: class Inner { public: void mutateOuter(Outer& o); }; private: int value; }; void Outer::Inner::mutateOuter(Outer& o) { o.value ++; // Legal? Or not? }

Lo pregunto porque en algunos compiladores que probé (VS2003) este código no funcionará, pero he escuchado al menos de forma anecdótica que funciona en algunos compiladores. No puedo encontrar una sección relevante en la especificación de C ++ sobre esto, y si alguien puede citar algo específico que diga que es o no es legal, sería genial.


Como el interrogador parece haber aceptado una de las respuestas, esto es solo una suplementación.
El estándar parece haber cambiado la especificación sobre la accesibilidad.

§11.8 / 1 en C ++ 98 dice:

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; Se obedecerán las reglas de acceso habituales.

§11.8 / 1 en N1804 (después de TR1) establece:

Una clase anidada es un miembro y, como tal, tiene los mismos derechos de acceso que cualquier otro miembro.

Creo que los compiladores actuales de C ++ obedecen a nuevas especificaciones.


Después de haber formulado más o menos la misma pregunta here , quería compartir la respuesta (aparentemente) actualizada para C ++ 11:

Citado en https://.com/a/14759027/1984137 :

standard $ 11.7.1

"Una clase anidada es un miembro y, como tal, tiene los mismos derechos de acceso que cualquier otro miembro. Los miembros de una clase adjunta no tienen acceso especial a los miembros de una clase anidada; las reglas de acceso habituales se cumplirán"

y las reglas de acceso habituales especifican que:

"Un miembro de una clase también puede acceder a todos los nombres a los que la clase tiene acceso ..."

Se han dado ejemplos específicos en la norma:

class E { int x; class B { }; class I { B b; // OK: E::I can access E::B int y; void f(E* p, int i) { p->x = i; // OK: E::I can access E::x } }; }


No tengo la ubicación precisa fuera de mi cabeza, pero sí recuerdo haber leído las especificaciones y encontrar que los datos privados de una clase están ocultos de todas las demás clases, incluidas las clases anidadas.

Básicamente, anidar una clase define un cierto alcance, no privilegios de acceso.


Esta respuesta pertenece a la especificación (obsoleta) de C ++ 03. La respuesta aceptada a esta pregunta es más actualizada.

Bueno, me siento tonto por hacer esta pregunta ahora porque acabo de encontrar la parte relevante de la especificación que cubre esto: §11.8 / 1:

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) serán obedecidas.

(Mi énfasis)

Así que parece que no, las clases internas no tienen privilegios de acceso especiales.