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
Ajustando links...
Linha 114: Linha 114:


----
----
{{C++Naveg}}
<div id="naveg" style="background-color: #ffffff; border: solid 0px black; padding-left:
15px; padding-right: 15px; margin: 4px; text-align: left; font-size: 100%">
[[Programar em C++/Índice|Índice]]
[[../../Básico/Introdução|Introdução]]
[[../../Básico/Compilação|Compilação]]
[[../../Básico/Alô, Mundo!|Alô, Mundo!]]
[[Programar em C++: Tipologia de dados|Tipologia de dados]]
[[Programar em C++: Variáveis|Variáveis]]
[[Programar em C++: Operadores|Operadores]]
[[Programar em C++: In-out|In-out]]
[[Programar em C++: Constantes|Constantes]]
[[Programar em C++: Execution Code – control loop jump|Execution Code – control loop jump]]
[[Programar em C++: Functions|Functions]]
[[Programar em C++: Arrays|Arrays]]
[[../../Básico/Ponteiros|Ponteiros]]
[[Programar em C++: Dinamic Memory allocation|Dinamic Memory allocation]]
[[Programar em C++: Strings|Strings]]
[[Programar em C++: Input –Output|Input –Output]]
[[Programar em C++: Enumerations|Enumerations]]
[[Programar em C++: Structures|Structures]]
[[Programar em C++: Unions|Unions]]
[[Programar em C++: Classes|Classes]]
[[Programar em C++: Friends|Friends]]
[[Programar em C++: Operator Overloading|Operator Overloading]]
[[Programar em C++: Inherence|Inherence]]
[[Programar em C++: Polimorfismo|Polimorfismo]]
[[Programar em C++: Virtual Members|Virtual Members]]
[[Programar em C++: Templates|Templates]]
[[Programar em C++: Exceptions|Exceptions]]
[[Programar em C++: Namespaces|Namespaces]]
[[Programar em C++: STL-Standard Template Library|STL-Standard Template Library]]
</div>

----
----



Revisão das 01h52min de 19 de julho de 2007

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


Friend functions

O que é

Declarando que uma função (externa á classe) friend dentro de uma classe, permite que a função (a amiga) possa aceder a membros (variáveis e funções membro) private e protected (e claro public mas isso já era permitido antes de serem friends). Coisa que as outras funções não podem.


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