varias sobrecarga publica operadores funciones funcion entre derivadas comunicacion clases amigas c++ namespaces friend

publica - sobrecarga de funciones c++



¿Es posible hacer amistad con una clase en un espacio de nombre anónimo en C++? (2)

Estoy portando código de Java a C ++ y me gustaría replicar algunas funcionalidades anónimas.

En el archivo Ah tengo:

class A { private: int a; class AnonClass; friend class AnonClass; };

En el archivo A.cpp tengo:

namespace { class AnonClass { public: AnonClass(A* parent) { parent->a = 0; // This doesn''t work, a is not accessible } } }

¿Es posible hacer amistad con una clase en un espacio de nombre anónimo en C ++?

En Java puedes declarar clases anónimas, por lo que sería muy similar. Además, no expondría a AnonClass a los clientes de Ah


Por lo que puedo ver, no puedes. Las razones:

  1. El espacio de nombre "anónimo" solo es accesible dentro del archivo en el que lo creó.
  2. Debe definir toda la clase AnonClass y sus funciones en un espacio de nombres, es decir, en un lugar del programa.
  3. La clase A debe definirse antes del constructor AnonClass.
  4. AnonClass debe declararse al menos antes de la clase A.

Como puede ver, no puede romper la definición de AnonClass en dos partes. Y no puedes definirlo antes y después de una clase.

La única opción: poner la clase A en el mismo espacio de nombres anónimo. Este código funciona:

namespace { class A { public: A():a(0){}; private: int a; friend class AnonClass; }; class AnonClass { public: AnonClass(A* parent); }; AnonClass::AnonClass(A* parent) { parent->a = 0; }; } int main() { A a; return 0; }

Espero que esto ayude.


Una alternativa menos conocida es hacer que la clase Anon sea una clase miembro de A. Dentro de la clase A solo necesita una class Anon; línea class Anon; - sin código real, sin declaración de amigo. Tenga en cuenta que va dentro de la clase A, casi como en Java. En el archivo .cpp, escribe todos los detalles sobre Anon pero no lo coloca en el espacio de nombres anónimo, sino dentro de A::

class A::Anon { ..... };

Puede dividir la declaración y la implementación de A :: Anon, como de costumbre, simplemente recuerde siempre agregar A :: a Anon.

La clase Anon es miembro de A y, como tal, tiene acceso a todos los demás miembros de A. Sin embargo, sigue siendo desconocido para los clientes de A y no ocupa espacio de nombres global.