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?

Dalton
fonte
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.

Martin York
fonte
Se você pudesse acessar publicamente os dados (por exemplo, através de um getter), teria usado uma função livre?
Ioanna