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;
}
};
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.
[1] Comentário enviado por cwars em 14/11/2007 - 10:51h
Esse foi um dos motivos que muitos afirmam que C++ havia se tornado uma linguagem inchada, pois existem muita coisa que quase não tem nenhuma utilidade, além que uma linguagem orientada a objetos (em minha opnião) só tem utilidade rodando em modo gerenciado, ou seja, numa máquina virtual, assim como: Java, Mono, Python, PhP e outra.
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.
[2] Comentário enviado por LucasG1995 em 03/08/2016 - 15:09h
Entao,resumindo,uma classe amiga eh uma segunda classe criada q pode acessar as funcoes da primeira?? No caso,a variavel t eh um objeto da classe amigas capaz de chamar as funcoes membro??? Eh isso msm? Obg