OVH Cloud OVH Cloud

pointeur de fonction ?

4 réponses
Avatar
Thierry Schembri
J'ai un petit problème avec des pointeurs de fonctions, est-ce que quelqu'un
pourrait m'aider ?

Voici le problème :

J'ai une classe toto (la fameuse)

class toto
{
typedef struct machin
{
int a;
int (toto::*fonction)(int);
}MACHIN;

MACHIN tab_machin[10];

int ma_fonction(int);
void bidule(void);
}

void toto::bidule(void)
{
tab_machin[0].a = 0;
tab_machin[0].fonction = &toto::ma_fonction;

Et là ça se corse, comment fais-je pour appeler la fonction pointée dans
tab_machin[0] ?

Je serais bien tenté par : "tab_machin[0].fonction(10);" façon C, mais
j'obtiens le message :

"Appel d'une non fonction" (j'utilise Borland c++ builder 4).

Quelqu'un peut m'aider ?

Merci d'avance.

4 réponses

Avatar
Frederic Lachasse
"Thierry Schembri" wrote in message
news:bmkjn7$89p$
J'ai un petit problème avec des pointeurs de fonctions, est-ce que
quelqu'un

pourrait m'aider ?

Voici le problème :

J'ai une classe toto (la fameuse)

class toto
{
typedef struct machin
{
int a;
int (toto::*fonction)(int);
}MACHIN;

MACHIN tab_machin[10];

int ma_fonction(int);
void bidule(void);
}

void toto::bidule(void)
{
tab_machin[0].a = 0;
tab_machin[0].fonction = &toto::ma_fonction;

Et là ça se corse, comment fais-je pour appeler la fonction pointée
dans

tab_machin[0] ?

Je serais bien tenté par : "tab_machin[0].fonction(10);" façon C,
mais

j'obtiens le message :

"Appel d'une non fonction" (j'utilise Borland c++ builder 4).


Les pointeurs vers functions membres sont déréférencés avec les opérateurs
.* (si on a une référence vers l'objet) et ->* (avec un pointeur vers
l'objet).

Si tu veux faire cet appel dans toto::bidule():

(this->*tab_machin[0].function)(10);

--
Frédéric Lachasse -

Avatar
Gourgouilloult
Frederic Lachasse wrote:

(this->*tab_machin[0].function)(10);


J'ai cru comprendre dans un autre post que les parenthèses autour de
l'expression donnant le pointeur de fonction étaient nécessaires. Par
contre, j'ai pas compris pourquoi. Quelqu'un peut me dire ?

Gourgou

Avatar
Cyrille Karmann
Thierry Schembri disait...
J'ai une classe toto (la fameuse)


class toto
{
typedef struct machin
{
int a;
int (toto::*fonction)(int);
}MACHIN;

MACHIN tab_machin[10];

int ma_fonction(int);
void bidule(void);
}

void toto::bidule(void)
{
tab_machin[0].a = 0;
tab_machin[0].fonction = &toto::ma_fonction;

Et là ça se corse, comment fais-je pour appeler la fonction pointée dans
tab_machin[0] ?

Je serais bien tenté par : "tab_machin[0].fonction(10);" façon C, mais
j'obtiens le message :

"Appel d'une non fonction" (j'utilise Borland c++ builder 4).


fonction est un pointeur de fonction *membre* de toto. Il faut donc
l'appliquer à un objet toto.

donc:
toto instance_toto;
(instance_toto.*tab_machin[0].fonction)(10);

ou encore, si tu es déjà dans une fonction membre de toto:
(this->*tab_machin[0].fonction)(10);

--
Cyrille
A Marco!


Avatar
Frederic Lachasse
"Gourgouilloult" <gourgou_at_club-internet_point_fr> wrote in message
news:3f8e53f5$0$15437$
Frederic Lachasse wrote:

(this->*tab_machin[0].function)(10);


J'ai cru comprendre dans un autre post que les parenthèses autour de
l'expression donnant le pointeur de fonction étaient nécessaires. Par
contre, j'ai pas compris pourquoi. Quelqu'un peut me dire ?


Simple: priorité des opérateurs. ->* et .* sont moins prioritaire que ->, .,
() et [] (qui ont la même priorité, d'ailleurs).

Donc sans les parenthèses:
this->*tab_machin[0].function(10)
est interprété comme:
this->*(tab_machin[0].function(10))
et comme ->, ., () et [] sont évalués de gauche à droite:
this->*(((tab_machin[0]).function)(10))

Avec les parenthèses:
(this->*tab_machin[0].function)(10);

est interprété comme:
(this->*(tab_machin[0].function))(10);

et comme ->, ., () et [] sont évalués de gauche à droite:
(this->*((tab_machin[0]).function))(10);

Ce qui ne donne pas le même résultat.

--
Frédéric Lachasse -