8
votes

Passer une fonction de membre de classe en tant que paramètre de fonction

j'ai 2 questions de classe 2 C ++:

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: xxx

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 ++?

EDIT: Mise en œuvre des conseils 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? xxx


2 commentaires

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.


3 Réponses :


15
votes

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 classname :: code>.

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 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>

Ceci est dû au fait que chaque NSMF a un 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> xxx pré>

La fonction 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>

Voyons donc votre appel potentiel de UN NSMF: P>

arg = &ClassName::Function;


3 commentaires

Ne devriez-vous pas dire (objet. * Arg) (paramètres); en raison de la priorité de l'opérateur?


@Kerrek SB: Oui, . * 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?



3
votes

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> xxx pré>

et appelez-le comme ceci: p>

DebuggingManager myInstance
myInstance->catalogueTest("TestName", std::bind(&DebuggingManager::test1, myInstance));


0 commentaires

0
votes

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.

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.

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. xxx


0 commentaires