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

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Daveiro (discussão | contribs)
Sem resumo de edição
Daveiro (discussão | contribs)
Sem resumo de edição
Linha 32:
 
----
 
 
 
== 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
{| border 1
|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.