Typiquement, celui-ci utilise une fonction de membre static
(qui prend un pointeur d'argument), auquel cas le l'objectToUse
est passée en tant que paramètre, et le MyMemberFunction
utiliserait objectToUse
de mettre en place un pointeur vers un objet MyClass
et utilisez-le pour faire référence aux variables membres et aux fonctions membres.
Dans ce cas Connect
contiendra quelque chose comme ceci:
void Connect(void *objectToUse, void (*f)(void *obj))
{
...
f(objectToUse);
...
}
[Il est également tout à fait possible que f
et objectToUse
sont enregistrés quelque part à utiliser plus tard, plutôt que réellement à l'intérieur connnect, mais l'appel serait regarde la même chose dans ce cas aussi - juste à partir d'une autre fonction appelée comme une conséquence de l'événement auquel cette fonction est supposée être appelée). Il est également POSSIBLE d'utiliser un pointeur vers la fonction membre, mais c'est assez complexe, et pas du tout facile à "corriger" - à la fois en termes de syntaxe et "quand et comment vous pouvez l'utiliser correctement". Voir plus .
Dans ce cas, Connect
regarderait un peu comme ceci:
void Connect(MyClass *objectToUse, void (Myclass::*f)())
{
...
objectToUse->*f();
...
}
Il est très probable que les modèles sont utilisés, comme si l'on sait « MyClass » dans la classe Connect, il serait assez inutile de avoir un pointeur de fonction. Une fonction virtuelle serait un bien meilleur choix. Dans les bonnes circonstances, vous pouvez également utiliser des fonctions virtuelles en tant que pointeurs de fonction membre, mais cela nécessite que le compilateur/l'environnement «joue». Voici quelques détails sur ce sujet [dont je n'ai aucune expérience personnelle: Pointeurs vers des fonctions membres virtuelles. Comment ça marche? Functors, qui est un objet enveloppant une fonction, permet de transmettre un objet avec un comportement spécifique en tant que «objet fonction». Cela implique généralement une fonction membre prédéfinie ou un operatorXX
appelé dans le cadre du traitement dans la fonction qui doit rappeler dans le code.
C++ 11 autorise les "fonctions Lambda", qui sont des fonctions déclarées à la volée dans le code, qui n'ont pas de nom. C'est quelque chose que je n'ai pas utilisé du tout, donc je ne peux pas vraiment commenter plus loin - j'ai lu à ce sujet, mais je n'avais pas besoin de l'utiliser dans ma programmation (passe-temps) - la plus grande partie de ma vie professionnelle est avec C, plutôt que C++ bien que j'ai travaillé pendant 5 ans avec C++ aussi.
Donc - '-> *' est-il réellement les opérateurs -> et * comme je suppose qu'ils sont ou est-ce un opérateur spécial séparé? – csteifel
Non '-> *' est un opérateur * distinct * de '->' et '*'. Consultez la FAQ - c'est à http://www.parashift.com/c++-faq/pointers-to-members.html pour plus d'informations. Il explique assez bien les indications aux membres. –