Para que é usada a palavra-chave "amigo"?


11

Você pode me explicar por que a friendpalavra-chave é preferida para conceder direitos de acesso a dados particulares da classe?


1
Se você perguntar por que friendfoi preferido, de que outras maneiras você costuma usar para acessar dados de classes particulares de fora?
— Benjamin Bannier

@honk "Preferred" pode ser a palavra errada a ser usada aqui. Eu editei a maior parte do post para corrigir a gramática e outros enfeites e mantive a escolha da palavra original, mas acho que pode haver uma barreira de idioma aqui.
— Adam Lear

Não sei porque li sobre amigo hoje por acaso. e o artigo diz que se eu não usar amigo, criarei uma classe monolit.
— Dalton

Respostas:


17

Friend é a maneira clássica de estender a interface de uma classe.
Mas o melhor é que esse amigo documenta explicitamente sua intenção de vincular itens específicos a uma classe.

Nota: Ao usar o amigo, você vincula os amigos à classe.

Um exemplo perfeito são os operadores de fluxo em 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;
}

Aqui estamos estendendo a interface pública da classe Plop de uma maneira que nos permita transmitir o objeto para dentro e fora de um fluxo, mas sem expor a implementação interna ou causar futuras dores de cabeça na implementação, exigindo o uso de métodos get / set que devem sejam mantidos (porque eles fariam parte da interface pública) mesmo se a implementação interna for alterada.

Nota: Isso NÃO quebra o encapsulamento, mas vincula firmemente os operadores de fluxo à implementação da classe Plop (ou seja, qualquer alteração na implementação da classe Plop exigirá uma alteração na implementação dos operadores de fluxo). Mas isso é esperado. Todas as partes da interface pública (incluindo métodos públicos / protegidos) estão fortemente vinculadas à implementação.

Mas Nota: Você documentou explicitamente essa ligação como parte da declaração de classe.

Nota: eu não me referiria a amigo como a maneira preferida de expor dados particulares. O uso excessivo de friend pode ser tão ruim quanto expor a implementação. Como todos os recursos de idioma, ele deve ser usado criteriosamente.


Se você pudesse acessar publicamente os dados (por exemplo, através de um getter), teria usado uma função livre?
— Ioanna
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.