Sommaire du chapitre :
Le mot-clé friend permet de régler le mode d'accès en le mettant public
pour certains objets appelants et privé pour d'autres.
Il y a trois niveaux :
-On peut autoriser l'accès à une fonction particulière, définie n'importe où
dans le programme.
-On peut limiter l'accès à une classe extérieure déterminée.
-On peut limiter l'accès à une fonction particulière d'une classe extérieure
déterminée.
Le mot-clé friend est surtout nécessaire lorsque l'on veut réaliser des
classes qui utilisent chacune des éléments de l'autre et demandent donc des
références croisées, ce qui est le cas, comme on le verra plus loin, pour les
opérateurs par exemple.
class X
{
int a ;
friend void f(X*);
} ;
void f(X *p)
{
p->a = 0;
}
void main()
X *Pointeur = new X ;
f(Pointeur) ;
}
Le mot-clé friend permet de placer dans une classe une fonction qui
peut être définie et appelée de n'importe quel point du programme.
La fonction est définie plus loin sans la faire précéder du nom de la classe.
Les instructions de cette fonction peuvent appeler tous les membres de la classe
même si ceux-ci ne sont pas publics, d'où le nom friend.
L'appel de la fonction peut se faire sans référence à un objet.
Si l'on veut référencer un objet particulier, on le fait de la façon présentée
dans l'exemple.
Le paramètre de la fonction est un pointeur sur la classe et un pointeur de
cette classe est passé comme paramètre.
class B ;
class A
{
private int a ;
f() ;
friend B ;
} ;
class B
{
void h (A *p) { p->a = 0 ; p->f() ; } ;
} ;
Dans une classe, on peut placer le nom d'une autre classe précédé de l'indication
friend.
Cette classe amie pourra accéder à tous les éléments de la classe qui l'a déclarée
classe amie.
Dans l'exemple, la classe A déclare la classe B amie.
La classe B pourra utiliser les membres de A.
La classe B doit être déclarée après la classe A pour que le compilateur connaisse
les membres de A dans B. Cependant il faut faire précéder A d'une déclaration
provisoire avancée de B car B est utilisée dans la déclaration de A.
La déclaration avancée est faite en première ligne de l'exemple.
class B ;
class A
{
private int a ;
friend void B::f() ;
}
class B
{
void f(A *p) { p->a = 0 } ;
} ;
Il est possible de restreindre la propriété friend à une seule fonction
d'une classe.
La syntaxe est donnée dans l'exemple.
Dans ce cas, seules les instructions de la fonction f() de la classe B pourront
atteindre les éléments de la classe A.