Pointeurs sur membres

Il est parfaitement possible de prendre l’adresse d’un membre de structure (ou de classe), comme ceci :

employe *pempl;int *empl_age = &(pempl->age);

Noter cependant les parenthèses imposées par la précédence des opérateurs (voir tableau en annexe ; pour l’intérêt et l’usage des pointeurs de fonctions, voir chapitre 5.)

Un problème se pose toutefois avec les fonctions membres non statiques. En effet, celles-ci admettent un paramètre implicite this. De ce fait, l’écriture suivante :

struct exemple {     // ...     void methode(int);     };				void (*pf)(int) = exemple::methode;    // incorrect

est interdite parce que le type de la fonction membre methode n’est pas void (*)(int). Le langage fournit donc des opérateurs spéciaux pour indiquer des pointeurs sur des membres d’une classe ; en l’occurrence, il faut ici utiliser ::* pour avoir le type correct de fonction :

void (exemple::*pf)(int) = exemple::methode;  // ok

Il est obligatoire de préciser exemple:: devant le nom de la méthode, car d’autres classes (dérivées, voir chapitre 8) pourraient être utilisées dans certains cas. Pour appeler ces méthodes, il faut toujours une instance de exemple. On utilise les opérateurs .* et ->* :

exemple ex, *pex;(ex.*pf)(6);      // équivaut à ex.methode(6);(pex->*pf)(9);    // équivaut à pex->methode(9);

Noter les parenthèses obligatoires car les opérateurs .* et ->* ont une précédence plus faible que les parenthèses d’appel de fonction (voir tableau en annexe). De plus, on ne peut pas ici omettre le déréférencement de pf comme on le ferait pour des pointeurs sur des fonctions normales.

On peut prendre des pointeurs sur des fonctions en ligne, mais celles-ci ne le sont plus forcément dans ce cas.

Précédent Précédent Sommaire Sommaire Suivant Suivant