La 1ère question est la suivante: comment puis-je le faire pour que je puisse passer une fonction de membre de classe comme paramètre dans une autre fonction et comment puis-je ensuite exécuter / appelez cette fonction? Et comment puis-je faire la même chose avec une fonction de classe statique. Il est peut-être plus facile de comprendre ma question en regardant ce code: p> la 2e question est: est-ce mauvais (ou dangereux) pratique d'appeler un membre de la classe (ou statique) fonctionner indirectement comme ce qui précède. J'ai le sentiment que c'est vraiment une mauvaise pratique C ++? P> EDIT: Mise en œuvre des conseils strong>
Merci pour la réponse, j'ai essayé de mettre en œuvre ce conseil, sa portée pour me faire passer la tête, serait-ce correct? p>
3 Réponses :
Les fonctions des membres statiques des classes sont finalement nulles différentes que des fonctions normales. Ils ne sont vraiment que du sucre syntaxique; La fonction est simplement comportant un nom comportant Les membres non statiques sont un autre problème. Il y a deux choses importantes à retenir sur les fonctions de membre non statiques (NSMF). P> Premièrement, chaque fonction de membre non statique a accès aux membres non statiques de la classe dont ils sont membres. Cela est possible même si vous pouvez avoir deux objets de la même classe qui se produisent pour stocker différentes données. Si vous avez deux objets Ceci est dû au fait que chaque NSMF a un La fonction Voyons donc votre appel potentiel de UN NSMF: P> classname :: code>.
std :: string code> objets, ils stockent chacun différentes chaînes. Exécuter un
Recherche code> sur une chaîne peut renvoyer un résultat trouvé en un mais pas l'autre. P>
implicite code> Ceci.
Ce code> fait référence à, non seulement une classe, mais le objet em> sur lequel NSMF fonctionne. Lorsque vous faites ceci: p>
recherche code> prend un argument de chaîne, mais il obtient également
astring code> comme son Ceci code>. Chaque fois que
trouver code> recherche les membres de sa classe, il envisagera des données
astring code>. P>
arg = &ClassName::Function;
Ne devriez-vous pas dire (objet. * Arg) (paramètres); code> en raison de la priorité de l'opérateur?
@Kerrek SB: Oui, . * Code> a une priorité inférieure à celle d'un appel de la fonction.
@Nicol Bolas: Merci pour votre réponse. J'ai essayé de mettre en œuvre ce que vous avez dit, est-ce correct?
en C ++ 11 Ils ont eu un moyen de faire cela. Lisez à propos de fonction et Bind Opérations.
Dans votre cas, disons que vous vouliez appeler des fonctions de type test1. (C'est-à-dire de formulaire Bool FunctionName (). p> et appelez-le comme ceci: p> DebuggingManager myInstance
myInstance->catalogueTest("TestName", std::bind(&DebuggingManager::test1, myInstance));
Voici ce que vous voulez, où X est votre classe, T est le retour de votre méthode et args sont les arguments que votre fonction reçoit.
Si votre méthode ne prend pas de ARG, ne les transmettez pas comme dans Test1 et test2. p>
Si votre méthode a été annulée, effacez le modèle T et écrivez le vide où T était sur la signature de méthodes. P>
Si vous avez des erreurs de liaison, n'oubliez pas de définir le DOMMAIRE et dostatique dans votre fichier .h. En définissant, je veux dire écrire toute la fonction, pas seulement sa signature. C'est dû aux problèmes de modèle. P>
Je suis surpris que cela ne réponde déjà. Peut-être que tout le monde est fatigué aussi et ne veut pas rechercher la syntaxe des pointeurs de la fonction membre pour la 500e fois.
Voir Stackoverflow.com/questions/2463112/... qui donne un lien vers PARASHIFT.COM/C ++ - FAQ-LITE / POINTERS-TO-MEMBRES.HTML qui a la syntaxe et les éléments à surveiller lors de la déclaration / utilisation de la fonction de membre normale et statique pointeurs. Quant à savoir si c'est mauvais, je dirais: probablement pas dans un cas particulier (comme des tests, ou peut-être d'autres), mais il ne serait pas bon de faire en tant que pratique quotidienne pour la rédaction de code, puisqu'il est délicat, Et comme il existe de meilleurs mécanismes pour la plupart de tout ce que vous les utiliseriez pour.