Usando o friend em C++
Dica publicada em C/C++ / Introdução
Usando o friend em C++
Programar usando orientação objeto significa encapsular num
mesmo módulo dados, informações e operações que de alguma
forma se relacionam. Porém as vezes é preciso quebrar esse
encapsulamento, por algum motivo, seja lá qual for ele. Para
isso C++ oferece o operador friend. Ele serve basicamente para
dizer para uma classe quais são sua (s) classe(s) amiga(s)
(friend == amigo). As classes amigas tem alguns privilégios que
as classes não-amigas não tem, como acessar os atributos e
métodos private por exemplo. Exemplo:
class teste {
public:
teste() { priv = 14; };
friend class amiga;
private:
int priv;
};
class amiga {
public:
amiga();
teste t;
void faz_alguma_coisa() {
/* a classe amiga é amiga da classe teste e pode acessar
seus atributos privados */
t.priv = 10;
}
};
class nao_amiga {
public:
nao_amiga();
teste t;
void faz_alguma_coisa() {
/* isso dá erro, porque o atributo priv da classe teste é
privado e nao_amiga não é amiga de teste*/
t.priv = 5;
}
};
public:
teste() { priv = 14; };
friend class amiga;
private:
int priv;
};
class amiga {
public:
amiga();
teste t;
void faz_alguma_coisa() {
/* a classe amiga é amiga da classe teste e pode acessar
seus atributos privados */
t.priv = 10;
}
};
class nao_amiga {
public:
nao_amiga();
teste t;
void faz_alguma_coisa() {
/* isso dá erro, porque o atributo priv da classe teste é
privado e nao_amiga não é amiga de teste*/
t.priv = 5;
}
};
Não vejo muita utilidade em friend e particularmente nunca o usei em nenhum dos meus programas. Sempre é possível reorganizar a classe de forma que não seja preciso quebrar o encapsulamento. Mas fica aí a dica se alguém precisar usar.
Contudo parece que essa moda de inchar a linguagem de coisas inúteis também está invadindo outras linguagens, C# mesmo na sua 3 versão está cheia de coisas sem valor e Java também está seguindo o mesmo caminho, acredito que uma linguagem deve ser como C, simples e prática, sem muitas invenções, mas ainda acho que o C poderia ser mais simples.