c++ c++17 friend

c++ - Cómo hacerse amigo de la clase anidada privada



c++17 friend (4)

De la misma manera obtienes acceso a cualquier otra cosa privada. Necesitas amistad de otra manera:

class TestA { friend class TestB; // <== this private: class Nested { }; }; class TestB { public: friend class TestA; friend class TestA::Nested; // <== now we''re a friend of TestA, so we can access it };

Pensé que podía hacer esto:

class TestA { private: class Nested { }; }; class TestB { public: friend class TestA; friend class TestA::Nested; };

Pero me sale un error:

Error C2248 ''TestA :: Anidado'': no ​​se puede acceder a la clase privada declarada en clase

¿Hay una manera de hacerse amigo de la clase anidada privada? ¿Cómo lo hago?

Encontré este error al intentar compilar un proyecto MSVC 6 en MSVC 2017 (C ++ 17). Supongo que funcionó entonces.


Estás intentando usar la clase anidada private de TestA en TestB , entonces deberías declarar TestB como el friend en TestA . p.ej

class TestA { private: class Nested { }; friend class TestB; // allow TestB to access the private members of TestA };


Esto lo hará:

class TestA { friend class TestB; private: class Nested {}; }; class TestB { public: friend class TestA::Nested; };

Explicación: es el propio TestA que tiene la responsabilidad de dar acceso a sus TestA internos a otros. Imagine que cualquier class podría usar la amistad de forma intrusiva para obtener acceso a las partes internas de otras clases (desde bibliotecas, etc.), esto abriría la puerta para romper arbitrariamente la encapsulación.


Solo comenta la friend class TestA::Nested; línea como abajo:

class TestA { private: class Nested { }; }; class TestB { public: friend class TestA; // friend class TestA::Nested; };

Como TestA::Nested tiene un alcance similar al de TestA , el TestA::Nested puede acceder a miembros privados / protegidos de TestB.