Le mot-clé friend


Sommaire du chapitre :

introduction

1. Fonction "friend"

2. Classe "friend"

3. Membre "friend"


Introduction

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.

retour au sommaire


1. Fonction "friend"

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.

retour au sommaire


2. Classe "friend"

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.

retour au sommaire


3. Membre "friend"

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.

retour au sommaire
chapitre suivant