Programar em C++/Friend: diferenças entre revisões

Origem: Wikilivros, livros abertos por um mundo aberto.
[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Linha 73: Linha 73:
Compreender bem a difereça entre friend functions e friend classes!!!! há bastantes pessoas que não apanham bem isto
Compreender bem a difereça entre friend functions e friend classes!!!! há bastantes pessoas que não apanham bem isto


<source lang=cpp>
// friend class
// friend class
#include <iostream>
#include <iostream>
Linha 108: Linha 109:
return 0;
return 0;
}
}
</source>






Revisão das 15h56min de 18 de fevereiro de 2009

Esta página precisa ser reciclada (discuta).
Ao melhorá-la, você estará ajudando o Wikilivros.

Friend functions

O que é

Friend é um atributo especial de acesso a classe, com ele declaramos que uma função fora de uma classe é amiga da mesma.

Declarando que uma função (externa á classe) "friend" dentro de uma classe, permite que a função (a amiga) possa ler e manipular membros (variáveis e funções membro) "private" - privados e "protected" - protegidos (e claro "public" - publicas, mas isso já era permitido antes de serem "friends").

Considerando que o acesso a membros pode ser restrito para determinadas partes do código, podemos adotar uma postura mais flexível para funções que conhecemos como confiáveis e evitar os inconvenientes da restrição a membros por códigos que não provoquem problemas maiores a nossa estrutura da aplicação.

Declarar friend functions

Para isto acontecer apenas temos de colocar o protótipo da função externa dentro da classe e colocando antes a palavra friend. Vamos ao exemplo:

 // friend functions
 #include <iostream>
 using namespace std;
 class CRectangle 
 {
    int width, height;
  public:
    void set_values (int, int);
    int area () {return (width * height);}
    friend CRectangle duplicate (CRectangle);
 };
 void CRectangle::set_values (int a, int b) 
 {
  width = a;
  height = b;
 }
 CRectangle duplicate (CRectangle rectparam)
 {
  CRectangle rectres;
  rectres.width = rectparam.width*2;
  rectres.height = rectparam.height*2;
  return (rectres);
 }
 int main () 
 {
  CRectangle rect, rectb;
  rect.set_values (2,3);
  rectb = duplicate (rect);
  cout << rectb.area();
  system (pause);
  return 0;
 }

Aconselham o não uso dos friends

Class name CRectangle private public
int width int height void set_values (int, int) int area () friend CRectangle duplicate
rect
rectb

Friend classes

Aqui o caso é igual ás friend functions só que agora temos o caso de ter uma segunda classe que tem acesso a membros privados e protegidos de uma dada classe.

Compreender bem a difereça entre friend functions e friend classes!!!! há bastantes pessoas que não apanham bem isto

 // friend class
 #include <iostream>
 using namespace std;
 class CSquare;
 class CRectangle 
 {
    int width, height;
  public:
    int area ()
      {return (width * height);}
    void convert (CSquare a);      //consigo aceder porque é friend
 };
 class CSquare 
 {
  private:
    int side;
  public:
    void set_side (int a) {side=a;}
    friend class CRectangle;      //declaro friend class
 };
 void CRectangle::convert (CSquare a) 
 {
  width = a.side;
  height = a.side;
 }
 int main () 
 {
  CSquare sqr;
  CRectangle rect;
  sqr.set_side(4);
  rect.convert(sqr);
  cout << rect.area();
  system (pause);
  return 0;
 }


Nota:

  • Não há a propriedade de reversão. O facto de uma função ou classe ser friend de uma classe não implica o contrário.ou seja Se numa class A for declarado que a class B é friend. Isto não implica que vai estar declarado na Class B que a class A é friend
  • Outra propriedade é que não há transitividade. Se numa class A for declarado que a class B é friend. E depois que na classe B estiver declarado que a classe C é friend de B,…Isto não implica que A seja friend de C.

Predefinição:C++Naveg