Appel de pointeurs sur fonctions
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 34 sur 61.
Maintenant que vous savez comment déclarer un pointeur de fonction et lui affecter une fonction, l’étape suivante consiste à appeler réellement la fonction via ce pointeur.
La syntaxe est simple. Vous utilisez le pointeur de fonction comme vous appelleriez une fonction ordinaire :
int add(int a, int b) {
return a + b;
}
int main() {
int (*operation)(int, int) = add;
int result = operation(5, 3); // Appelle add(5, 3)
printf("%d\n", result); // Sortie : 8
return 0;
}Écrivez simplement le nom du pointeur suivi de parenthèses contenant les arguments. C déréférence automatiquement le pointeur et exécute la fonction vers laquelle il pointe.
Vous pouvez également utiliser la syntaxe de déréférencement explicite avec (*operation)(5, 3), mais c’est facultatif et moins courant. Les deux formes produisent des résultats identiques.
La véritable puissance apparaît lorsque vous réaffectez le pointeur à différentes fonctions :
int subtract(int a, int b) {
return a - b;
}
operation = subtract;
result = operation(5, 3); // Appelle maintenant subtract(5, 3)
printf("%d\n", result); // Sortie : 2La même variable operation exécute désormais une logique complètement différente. Cette capacité à remplacer le comportement à l’exécution constitue le fondement du polymorphisme en C.
Défi
FacileEntraînons-nous à appeler des fonctions via des pointeurs et à changer la fonction exécutée. Tu vas créer une calculatrice simple capable de basculer entre l’addition et la soustraction lors de l’exécution.
Écris un programme qui :
- Définit deux fonctions :
add: prend deux paramètresintet renvoie leur sommesubtract: prend deux paramètresintet renvoie le premier moins le second
- Dans
main, déclare un pointeur de fonction appelécalcqui peut pointer vers des fonctions prenant deux paramètresintet renvoyant unint - Lit quatre entrées : deux entiers et deux codes d’opération
- Pour chaque code d’opération :
- Attribue la fonction appropriée à
calc(1 pour l’addition, 2 pour la soustraction) - Appelle la fonction via le pointeur avec les deux nombres
- Affiche le résultat
- Attribue la fonction appropriée à
Tu recevras quatre entrées : le premier nombre, le deuxième nombre, le premier code d’opération (1 ou 2) et le deuxième code d’opération (1 ou 2).
Ta sortie doit afficher deux résultats sur des lignes distinctes : un pour chaque opération effectuée avec les mêmes deux nombres :
15
5Dans cet exemple, avec les entrées 10, 5, 1, 2 : la première opération (code 1) additionne 10 + 5 = 15, puis le pointeur est réaffecté, et la deuxième opération (code 2) soustrait 10 - 5 = 5.
Cela montre comment la même variable pointeur peut exécuter une logique complètement différente en lui réattribuant une fonction entre les appels.
Essayez vous-même
#include <stdio.h>
// TODO: Définir la fonction add ici
// TODO: Définir la fonction subtract ici
int main() {
// Lire les entrées
int num1, num2, op1, op2;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &op1);
scanf("%d", &op2);
// TODO: Déclarer un pointeur de fonction appelé 'calc' qui peut pointer vers
// des fonctions prenant deux paramètres int et renvoyant un int
// TODO: Pour le premier code d'opération (op1) :
// - Assigner la fonction appropriée à calc (1 pour add, 2 pour subtract)
// - Appeler la fonction via le pointeur et afficher le résultat
// TODO: Pour le second code d'opération (op2) :
// - Réassigner calc à la fonction appropriée
// - Appeler la fonction via le pointeur et afficher le résultat
return 0;
}Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Programmation Orientée Objet
1Bases de la programmation modulaire
Fichiers d'en-têteGardes d'inclusionFichiers sourcesFonctions statiquesRécapitulatif : Calculatrice modulaire4Encapsulation
Concept des pointeurs opaquesDéfinir des structures opaquesGetters et settersValidation dans les settersRécapitulatif : La boîte secrète7Pointeurs sur fonctions
Déclaration de pointeurs sur fonctionsAppel de pointeurs sur fonctionsTypedef pour les pointeurs sur fonctionsPassage de fonctions en argumentsRécapitulatif : Dispatcher de calculatrice2Objets et méthodes
Structs comme objetsLe pointeur 'Self'Rigueur du mot-clé constPointeur vs ValeurMéthodes utilitairesRécapitulatif : Point Manager5Projet : Compte bancaire simple
Configuration du projetImplémentation du compte8Polymorphisme
Pointeurs de fonctions dans les structuresSimulation de méthodesLe concept d'interfaceImplémentation d'interfacesItération polymorphiqueRécapitulatif : Greeter11Patrons de conception en C
Patron SingletonPatron FabriquePatron ItérateurRécapitulatif : Logger Factory3Cycle de vie des objets
Pattern de constructeurPattern de destructeurInitialisation sur la pileCopie profondeRécapitulatif : String Wrapper6Héritage par composition
Imbrication de structLa règle du premier membreAccès aux membres parentsUpcastingRécapitulatif : Hiérarchie des formes9Projet : Dessinateur de formes
Aperçu du projetImplémentation du cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne