Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
Michael <michael_delva.enlever@hotmail.com> 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.
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
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.
Michael <michael_delva.enlever@hotmail.com> 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.
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.