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.