¿Cuándo deberías usar 'amigo' en C++?
He estado leyendo las preguntas frecuentes de C++ y tenía curiosidad acerca de la friend
declaració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?
En primer lugar (en mi opinión), no escuches a las personas que dicen friend
que 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 friend
especificador 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 );
};
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.