Main menu:

Site search

Categories

août 2008
L M M J V S D
 123
45678910
11121314151617
18192021222324
25262728293031

Archive

C++ – Classes et fonctions amies

On utilise la notion d’ami lorsque l’on a deux classes dont l’une doit avoir accès aux données membres privées de l’autre.
Cette façon de faire permet de limiter à une seule classe l’accès à des données privées et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe.

class A
{
  public:
    void f();
};

class B
{
  private:
    friend class A;
    int g(){return x;}
    int x;
};

Il est important de remarquer que c’est la classe qui veut partager ses données privées avec une autre qui donne l’accès à celles-ci en spécifiant que l’autre classe est une amie.
Cela se fait avec le mot-clé friend suivi de la classe qui reçoit l’accès aux données privées.
Les bonnes pratiques de la programmation veulent que même si dans ce cas-ci, A a accès à x dans B, A n’y fasse appel que via une fonction privée g(), qui sert d’interface, et non directement. Rien ne l’empêche néanmoins si ce n’est le code de bonne pratique.

En réalité, cette notion de classe amie est une généralisation des fonctions amies. On peut très bien avoir une fonction membre d’une classe ou une fonction globale à laquelle une classe accorderait l’accès à ses données privées. Le principe est le même que pour une classe.

class A
{
  public:
    int f();

class B
{
  private:
    friend int global_func();
    friend void A::f();
    int x;
};

int A::f()
{
  B b;
  return b.x;
}

int global_func()
{
  B b;
  return b.x;
}

Notez également que les déclarations d’amis peuvent être faites tant dans la partie privée que publique de la classe. Il n’y a aucune différence entre les deux.