8
votes

Comment fonctionnent les pointeurs de la fonction?

Je pose des questions spécifiques.

  1. Comment puis-je les initialiser dans une classe?
  2. Comment puis-je passer une fonction comme un argument?
  3. Les pointeurs de fonction doivent être déclarés et définis dans la classe?

    pour la question numéro 2 Voici ce que je veux dire: xxx


0 commentaires

4 Réponses :


24
votes

Pour définir un pointeur de fonction, utilisez la syntaxe suivante:

void invokeFunction(int func_argument, FunctionAcceptingAndReturningInt func) {
   int result = func(func_argument);
   printf("%i", result);
}

int timesFive(int arg) {
   return arg * 5;
}
invokeFunction(10, &timesFive); //prints 50


6 commentaires

Vous n'avez pas besoin et pour obtenir l'adresse d'une fonction.


@Luis G. Costantini R.: Vous avez besoin du et pour les pointeurs-membres (ISO 14882: 2003 C ++ Standard 5.3.1 / 3). J'utilise personnellement & dans tous les cas pour indiquer que je suis en train de passer un pointeur de fonction.


@Jacob Relkin - Je connais bien de l'université que vous utilisez cela très rarement ?. Quand j'avais un recours à utiliser des pointeurs de la fonction?


@ sil3nt: dans les algorithmes de bibliothèque standard


@ Sil3nt: Les pointeurs de fonction sont le moyen d'avoir des fonctions de rappel dans une API publique compatible C . Dans un module C ++, cependant, un pointeur à une classe abstraite avec une fonction virtuelle appropriée est beaucoup plus flexible.


@ SIL3NT: En C, on peut utiliser des pointeurs de fonction pour simuler ce que vous faites avec des fonctions virtuelles en C ++. C'est-à-dire que vos "objets" peuvent être des structs ou des tableaux avec un ensemble de pointeurs vers des fonctions, puis des "classes" différentes peuvent mettre leur propre "méthode" des pointeurs dans ces emplacements. Une autre utilisation est destinée aux types de conceptions «de rappel» entraînées par des événements.



1
votes

Vous devez déclarer f de cette manière: xxx

ici est un excellent tutoriel sur les pointeurs de fonction et les rappels.


0 commentaires

2
votes

Ce n'est pas la réponse forte> stricte forte>, mais pour inclure le code configurable / assignable en tant que membre de la classe, je mentionnerais à l'aide d'une classe / de structure avec l'opérateur (). Par exemple:

Foo code(5);
std::cout << code.f(2) << std::endl;


0 commentaires

0
votes

Pour répondre à la 3ème question, vous n'avez pas à le déclarer dans une classe. Mais ne pas transgresser l'encapsulation, je préfère généralement les pointeurs de la fonction des membres ou les foncteurs que les points de vue sont à nouveau membres des classes. Des exemples ci-dessus sont des pointeurs de la fonction de style C sauf Luis G. Costantini R. Vous pouvez consulter pour une approche des pointeurs de la fonction membre. Les pointeurs de fonction de style C sont généralement considérés, par exemple, des mécanismes de rappel dans lesquels il existe un code C que vous recevez des messages asynchrones. Dans de tels cas, il n'y a pas d'options plutôt que de déclarer des méthodes de gestionnaire dans la portée mondiale.


0 commentaires