 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Guest
|
Posted: Thu Sep 01, 2005 4:38 pm Post subject: Pointeur de fonction en paramètre de fonction |
|
|
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
|
|
| Back to top |
|
 |
Horst Kraemer Guest
|
Posted: Fri Sep 02, 2005 8:54 am Post subject: Re: Pointeur de fonction en paramètre de fonction |
|
|
Michael <michael_delva.enlever (AT) hotmail (DOT) com> wrote:
| Quote: | 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
|
|
| Back to top |
|
 |
Philippe Amarenco Guest
|
Posted: Fri Sep 02, 2005 9:03 am Post subject: Re: Pointeur de fonction en parametre de fonction |
|
|
Michael <michael_delva.enlever (AT) hotmail (DOT) com> writes:
| Quote: | 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.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|