OVH Cloud OVH Cloud

Pointeur de fonction en paramètre de fonction

2 réponses
Avatar
Michael
Bonjour à tous,

soient les classes suivantes:

class A
{
public:
void fooA();
void toto();
}


namespace
{
typedef void (*fonction)();
};

class B
{
public:
void fooB(fonction fn);
}

void B::fooB()
{
(*fn)();
}

void A::fooA()
{
B b;
b.fooB(toto);
}

C'est au niveau du passage de paramètre dans A::fooA() que ça coince...

Si je laisse comme ça, il m'indique l'erreur suivante:

Impossible de trouver une correspondance pour 'B::fooB(void)'

Si je mets b.fooB(&toto):

Impossible de trouver une correspondance pour 'B::fooB(void (* (_closure
)())())'


J'ai vu un exemple comme ça dans 'Modern C++ Design' d'Alexandrescu, mais
lui passe un pointeur sur une fonction qui n'est pas dans une classe...

Quelle est la bonne syntaxe?

Merci d'avance

2 réponses

Avatar
Horst Kraemer
Michael wrote:

Bonjour à tous,

soient les classes suivantes:

class A
{
public:
void fooA();
void toto();
}


namespace
{
typedef void (*fonction)();
};

class B
{
public:
void fooB(fonction fn);
}

void B::fooB()
{
(*fn)();
}

void A::fooA()
{
B b;
b.fooB(toto);
}

C'est au niveau du passage de paramètre dans A::fooA() que ça coince...

Si je laisse comme ça, il m'indique l'erreur suivante:

Impossible de trouver une correspondance pour 'B::fooB(void)'

Si je mets b.fooB(&toto):

Impossible de trouver une correspondance pour 'B::fooB(void (* (_closure
)())())'


J'ai vu un exemple comme ça dans 'Modern C++ Design' d'Alexandrescu, mais
lui passe un pointeur sur une fonction qui n'est pas dans une classe...

Quelle est la bonne syntaxe?


Il n'y pas de bonne syntaxe. On ne peut pas passer une fonction membre
non statique d'une classe à un paramètre du type "pointeur de
fonction". L'appel

(*fn)();

n'aurait pas de sens, parce qu'on ne peut appeler une fonction membre
non statique de A que par un objet du type A ou d'un type dérivé de A.
Une technique qui fonctionne serait:

void fooB(A& a, void A::*fn)
{
(a.*fn)();
}


void A::fooA()
{
B b;
b.fooB(*this,&toto);
}

Le paramètre de fooB est "pointeur de fonction membre non statique de
A" et on passe un objet pour l'appel de la fonction membre à travers
le pointeur.

--
Horst

Avatar
Philippe Amarenco
Michael writes:

Bonjour à tous,

soient les classes suivantes:

class A
{
public:
void fooA();
void toto();
}


namespace
{
typedef void (*fonction)();
};

class B
{
public:
void fooB(fonction fn);
}

void B::fooB()
{
(*fn)();
}

void A::fooA()
{
B b;
b.fooB(toto);
}

C'est au niveau du passage de paramètre dans A::fooA() que ça coince...

Si je laisse comme ça, il m'indique l'erreur suivante:

Impossible de trouver une correspondance pour 'B::fooB(void)'

Si je mets b.fooB(&toto):

Impossible de trouver une correspondance pour 'B::fooB(void (* (_closure
)())())'


J'ai vu un exemple comme ça dans 'Modern C++ Design' d'Alexandrescu, mais
lui passe un pointeur sur une fonction qui n'est pas dans une classe...



voire google 'pointer to member function'

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

int main()
{
A x;
void (A::*func)() = &A::foo

(x.*func)();
}

--
Philippe Amarenco, aka Phix
epita 2007 - LSE - EpX
"if new true friend not protected for explicit private union, break
case and try using this." -- Nathan Myers, longest c++ sentence.