OVH Cloud OVH Cloud

Pointeur de fonction membre

1 réponse
Avatar
Bruno CAUSSE
Comment écrire une fonction membre qui appelle un pointeur de fonction
membre

#define callMemberFunction(object,ptrToMember)  ((object).*(ptrToMember))

class Fred {

//Cela suffit (a l'interieur de la classe)
typedef  int (*FredMemberFn)(char, float);
//Ou faut il:
typedef  int (Fred::*FredMemberFn)(char, float);

//cela suffit (idem)
FredMemberFn a[4] = { &f, &g, &h, &i };
//Ou faut il
FredMemberFn a[4] = { &Fred::f, &Fred::g, &Fred::h, &Fred::i };


public:
int f(char x, float y);
int g(char x, float y);
int h(char x, float y);
int i(char x, float y);
      // ...

void userCode(int memberFunctionNum)

};

//est ce correcte?
void Fred::userCode(int memberFunctionNum)
{
// pré-supose que memberFunctionNum est compris entre 0 et 3 inclus:
callMemberFunction(this, a[memberFunctionNum]) ('x', 3.14);
}

1 réponse

Avatar
kanze
Bruno CAUSSE wrote:
Comment écrire une fonction membre qui appelle un pointeur de
fonction membre


void
MaClasse::f( void (MaClasse::*pfm)() )
{
(this->*pfm)() ;
}

#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))


Ça pourrait marcher aussi :

callMemberFunction( *this, pfm )() ;

Franchement, je ne vois pas l'intérêt.

class Fred {

//Cela suffit (a l'interieur de la classe)
typedef int (*FredMemberFn)(char, float);
//Ou faut il:
typedef int (Fred::*FredMemberFn)(char, float);


La seconde. La première déclare toujours un pointeur à une
fonction libre (ou à une fonction membre statique).

//cela suffit (idem)
FredMemberFn a[4] = { &f, &g, &h, &i };
//Ou faut il
FredMemberFn a[4] = { &Fred::f, &Fred::g, &Fred::h, &Fred::i };


La séconde.

public:
int f(char x, float y);
int g(char x, float y);
int h(char x, float y);
int i(char x, float y);
// ...

void userCode(int memberFunctionNum)

};

//est ce correcte?
void Fred::userCode(int memberFunctionNum)
{
// pré-supose que memberFunctionNum est compris entre 0 et 3 inclus:
callMemberFunction(this, a[memberFunctionNum]) ('x', 3.14);


(this->*(a[ memberFunctionNum ]))( 'x', 3.14 ) ;

Les parenthèses autour de l'accès au tableau ne sont pas
strictement nécessaire. L'utilisation de l'opérateur ->* est
assez peu fréquente, cependant, et je trouve donc qu'il y a une
risque que le programmeur moyen ne connaisse pas la précédance
tout de suite.

Avec ton macro, il faudrait *this, à la place de this.

}


--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34