¿Para qué se usa la palabra clave "amigo"?


11

¿Puede explicarme por qué friendse prefiere la palabra clave para otorgar derechos de acceso a datos privados de clase?


1
Si pregunta por qué friendse prefirió, ¿qué otras formas utiliza habitualmente para acceder a datos de clase privada desde el exterior?
Benjamin Bannier el

@honk "Preferido" podría ser la palabra incorrecta para usar aquí. Edité la mayor parte de la publicación para corregir la gramática y otras cosas y mantuve la elección de la palabra original, pero creo que puede haber una barrera de idioma aquí.
Adam Lear

No sé porque leí sobre amigos hoy por casualidad. y el artículo dice que si no uso friend, crearé una clase monolit.
Dalton el

Respuestas:


17

Friend es la forma clásica de extender la interfaz de una clase.
Pero lo mejor es que ese amigo documenta explícitamente su intención de vincular estrechamente elementos específicos a una clase.

Nota: Al usar amigo, estás vinculando estrechamente a los amigos a la clase.

Un ejemplo perfecto son los operadores de flujo en C ++

class Plop
{
    private:
        int  value;
        friend std::ostream& operator<<(std::ostream& stream, Plop const& data);
        friend std::istream& operator>>(std::istream& stream, Plop&       data);
};

std::ostream& operator<<(std::ostream& stream, Plop const& data)
{
     return stream << data.value << " ";
}
std::istream& operator>>(std::istream& stream, Plop&       data)
{
     return stream >> data.value;
}

Aquí estamos ampliando la interfaz pública de la clase Plop de una manera que nos permite transmitir el objeto dentro y fuera de una secuencia, pero sin exponer la implementación interna o causar futuros dolores de cabeza de implementación al requerir el uso de métodos get / set que deben mantenerse (porque serían parte de la interfaz pública) incluso si se cambia la implementación interna.

Nota: Esto NO interrumpe la encapsulación, pero sí une estrechamente a los operadores de flujo a la implementación de la clase Plop (es decir, cualquier cambio en la implementación de la clase Plop requerirá un cambio en la implementación de los operadores de flujo). Pero esto se espera. Todas las partes de la interfaz pública (incluidos los métodos públicos / protegidos) están estrechamente vinculadas a la implementación.

Pero Nota: Usted ha documentado explícitamente este enlace como parte de la declaración de clase.

Nota: No me referiría a friend como la forma preferida de exponer datos privados. El uso excesivo de amigos puede ser tan malo como exponer la implementación. Al igual que todas las características del lenguaje, debe usarse con prudencia.


Si pudieras acceder públicamente a los datos (por ejemplo, a través de un getter), ¿hubieras utilizado una función gratuita?
Ioanna
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.