Você pode me explicar por que a friend
palavra-chave é preferida para conceder direitos de acesso a dados particulares da classe?
Você pode me explicar por que a friend
palavra-chave é preferida para conceder direitos de acesso a dados particulares da classe?
Respostas:
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.
friend
foi preferido, de que outras maneiras você costuma usar para acessar dados de classes particulares de fora?