Sei sulla pagina 1di 5

Classes e Funes Friend Programao Orientada a Objectos ____________________________________________________________________________________________ _________

FUNES FRIEND Em C++ temos a possibilidade de quebrar o encapsulamento que a Programao Orientada para Objecto cria e de que tanto se orgulha. Essa facilidade traduz-se por funes e classes friend. Funes friend de uma classe so funes ( normais ou funes membros de outras classes) que tm acesso aos membros privados ou protegidos dessa classe. Uma funo pode ser declarada como friend de mais do que uma classe. As funes friend devem ser indicadas na classe da qual a funo friend e essa indicao pode aparecer quer na parte pblica quer na parte privada da classe. As funes friend so portanto declaradas na classe que lhe permite o acesso. A declarao de uma funo friend semelhante declarao de uma funo normal (no membro), sendo precedida pela palavra reservada friend friend <prottipo da funo>; As definies e chamadas so tambm iguais s definies e chamadas das funes normais. No caso de funes membro, a classe de objectos cujos componentes vo ser acedidos, esses objectos tero que ser passados como um argumento funo friend. A palavra friend no aparece na definio da funo, s na declarao da classe de que a funo friend. EXEMPLO Considere-se agora o exemplo, em que declaramos a funo funo_amiga como funo friend da classe Circulo. Neste caso, a funo_amiga tem como parmetro, um objecto Circulo e a funo acede ao raio desse objecto, que um dado privado da classe Circulo.

#include <stdio.h> class Circulo {


____________________________________________________________________________________________ _________ Departamento de Eng Informtica do ISEP 1

Classes e Funes Friend Programao Orientada a Objectos ____________________________________________________________________________________________ _________

private: float raio; int fcentrox; int fcentroy; friend void esfera_amiga(Circulo circ); public: Circulo(float raio1,int centrox1,int centroy1) { raio=raio1; fcentrox=centrox1; fcentroy=centroy1; }; float circunferencia() {return(2*3.1416*raio);} float area() { return(4*3.1416*raio*raio);} void display() { printf("raio=%f\n",raio); printf("coordenads do centro x=%d\n",fcentrox); printf(" y=%d\n",fcentroy); }; }; void esfera_amiga(Circulo circ);

main() { Circulo circ(5,3,3); circ.display(); printf("circunferncia=%f\n",circ.circunferencia()); printf(" rea=%f\n",circ.area()); esfera_amiga(circ); } void esfera_amiga(Circulo c) { printf("Sou amiga tambem posso escrever o raio %f",c.raio); }; ..... .... ....

____________________________________________________________________________________________ _________ Departamento de Eng Informtica do ISEP 2

Classes e Funes Friend Programao Orientada a Objectos ____________________________________________________________________________________________ _________

CLASSES FRIEND Podemos tambm ter classes friend, neste caso, o especificar uma classe como friend equivalente a especificar todas as funes membros da classe como friend. Se uma classe A friend de uma classe B, as funes membro de A (mtodos), so funes friend da classe B, logo todos os mtodos de A tm acesso aos membros protegidos e privados de B. Neste caso , na declarao da classe B deve aparecer friend class A; A declarao de uma classe friend a declarao forward da classe precedida da palavra friend friend class < identificador da classe>; Tudo o que se disse sobre funes friend aplica-se tambm s classes. Devemos ter ainda em conta o seguinte: -friend no mtuo, se a classe A friend de B o inverso no se verifica, isto , B no friend de A. -friend no herdvel, logo se A friend de B, uma classe derivada de A no o . -friend no transitivo, se a classe A friend da B e se B friend de C, A no friend de C.

Exemplo Vamos agora declarar, a funo h, como friend de 2 classes, X e Y. Declaramos tambm, a funo g, a funo f (membro da classe Y) e a classe Z como friend da classe X.
class X ; // declarao forward class Y { float indice; .... .... ....
____________________________________________________________________________________________ _________ Departamento de Eng Informtica do ISEP 3

Classes e Funes Friend Programao Orientada a Objectos ____________________________________________________________________________________________ _________

public: int f(X a); friend float h (X a,Yb); }; class X { int den,num; ... .... .... public: friend float g (X a); friend int Y:: f (X a); friend float h (X a, Y b); friend class Z; .... .... .... }; class Z // os membros desta classe podem aceder aos componentes privados da classe X, uma vez que friend. {..... ... .... public: int p (X a) {.... .... .... int d=a.num; }; int q (X a) {.... .... .... int c=a.den; }; }; int Y :: f (X a) { indice=a.num / a.den; .... .... .... }; float g (X a) { int b=a.num; .... .... .... }; float h (X a, Yb) { b.indice=a.num/a.den; ... ... ...
____________________________________________________________________________________________ _________ Departamento de Eng Informtica do ISEP 4

Classes e Funes Friend Programao Orientada a Objectos ____________________________________________________________________________________________ _________

};

INCONVENIENTES E VANTAGENS DAS FUNES FRIEND

Como se verifica, estas funes ao acederem aos membros privados das classes, vo abrir buracos no encapsulamento que a classe preserva, portanto sob o ponto de vista da consistncia no aconselhado a sua utilizao. Isto vai permitir, por exemplo, retirar um elemento do meio de uma stack e colocar outro a substitui-lo, operao essa embora vivel atravs de uma funo que seja friend da classe stack, no consistente com a semntica de stack. Claro que o facto de aceder a dados protegidos e privados de mltiplas classes vai evitar o overhead associado ao chamar de funes de interface. Por outro lado, se no fossem as funes friend, a nica maneira de aceder a membros privado de uma classe seria torn-los pblicos. Ao fazer isso, os detalhes internos da classe seriam acessiveis aos utilizadores que efectivamente no precisam de os conhecer.

____________________________________________________________________________________________ _________ Departamento de Eng Informtica do ISEP 5

Potrebbero piacerti anche