¿Cuándo deberías usar 'amigo' en C++?

Resuelto Peter Mortensen asked hace 16 años • 31 respuestas

He estado leyendo las preguntas frecuentes de C++ y tenía curiosidad acerca de la frienddeclaración. Personalmente nunca lo he usado, sin embargo estoy interesado en explorar el idioma.

¿ Cuál es un buen ejemplo de uso friend?


Al leer las preguntas frecuentes un poco más, me gusta la idea de que el << >>operador se sobrecargue y se agregue como amigo de esas clases. Sin embargo, no estoy seguro de cómo esto no rompe la encapsulación. ¿Cuándo pueden estas excepciones mantenerse dentro del rigor de la programación orientada a objetos?

Peter Mortensen avatar Aug 20 '08 12:08 Peter Mortensen
Aceptado

En primer lugar (en mi opinión), no escuches a las personas que dicen friendque no es útil. Es útil. En muchas situaciones, tendrá objetos con datos o funcionalidades que no están destinados a estar disponibles públicamente. Esto es particularmente cierto en el caso de grandes bases de código con muchos autores que pueden estar sólo superficialmente familiarizados con diferentes áreas.

HAY alternativas al especificador de amigos, pero a menudo son engorrosas (clases concretas de nivel cpp/definiciones de tipos enmascaradas) o no infalibles (comentarios o convenciones de nombres de funciones).

Sobre la respuesta;

El friendespecificador permite que la clase designada acceda a datos protegidos o a funciones dentro de la clase que realiza la declaración de amigo. Por ejemplo, en el siguiente código, cualquiera puede preguntarle a un niño su nombre, pero solo la madre y el niño pueden cambiar el nombre.

Puede llevar este ejemplo simple más allá considerando una clase más compleja como una ventana. Es muy probable que una ventana tenga muchos elementos de función/datos que no deberían ser accesibles públicamente, pero que SON necesarios para una clase relacionada, como un WindowManager.

class Child
{
//Mother class members can access the private parts of class Child.
friend class Mother;

public:

  string name( void );

protected:

  void setName( string newName );
};
Andrew Grant avatar Aug 20 '2008 05:08 Andrew Grant

En el trabajo utilizamos amigos para probar código extensamente. Significa que podemos proporcionar una encapsulación y ocultación de información adecuadas para el código de la aplicación principal. Pero también podemos tener un código de prueba separado que utilice amigos para inspeccionar el estado interno y los datos para realizar pruebas.

Basta decir que no usaría la palabra clave amigo como componente esencial de su diseño.

Dominik Grabiec avatar Aug 30 '2008 09:08 Dominik Grabiec