Passage de fonctions en arguments
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 36 sur 61.
L’une des utilisations les plus puissantes des pointeurs de fonction consiste à les transmettre comme arguments à d’autres fonctions. Cela vous permet d’injecter un comportement personnalisé dans une fonction sans modifier son code : une technique parfois appelée callback.
Considérez une fonction qui effectue un calcul sur deux nombres. Au lieu de coder l’opération en dur, vous pouvez accepter un pointeur de fonction qui définit l’opération à effectuer :
typedef int (*Operation)(int, int);
int compute(int a, int b, Operation op) {
return op(a, b);
}La fonction compute ne sait pas si elle effectue une addition, une soustraction ou quelque chose de complètement différent. Elle appelle simplement la fonction qui lui est transmise :
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
printf("%d\n", compute(5, 3, add)); // Sortie : 8
printf("%d\n", compute(5, 3, multiply)); // Sortie : 15
return 0;
}Remarquez comment la même fonction compute produit des résultats différents selon la fonction que nous lui transmettons. Ce modèle est fondamental pour écrire du code flexible et réutilisable. Vous écrivez la structure une seule fois, et les utilisateurs de votre fonction fournissent la logique spécifique dont ils ont besoin.
Défi
FacileÉcrivez une fonction apply_twice qui prend deux entiers et un code d’opération, applique l’opération aux nombres deux fois de suite, puis renvoie le résultat final.
Votre fonction recevra un code d’opération qui détermine l’opération à utiliser. Vous devez définir les fonctions d’opération dans votre solution et les transmettre à une fonction auxiliaire compute qui accepte un pointeur de fonction.
Remarque : seules les fonctions sont nécessaires. Les tests appellent directement apply_twice et vérifient sa valeur de retour : ne lisez donc aucune entrée et n’affichez rien.
Structure requise :
- Définir un
typedefappeléOperationpour un pointeur de fonction qui prend deux paramètresintet renvoie unint - Définir deux fonctions d’opération :
add(renvoie a + b) etmultiply(renvoie a * b) - Définir une fonction
computequi prend deux entiers et un pointeur de fonctionOperation, puis renvoie le résultat de l’appel de l’opération - Dans
apply_twice, sélectionner l’opération appropriée en fonction du code, puis utilisercomputedeux fois : d’abord avec les nombres d’origine, puis avec le résultat et le deuxième nombre à nouveau
Logique :
- Sélectionner la fonction d’opération en fonction de
op_code(1 = addition, 2 = multiplication) - Appeler
compute(a, b, operation)pour obtenir un résultat intermédiaire - Appeler
compute(intermediate, b, operation)pour obtenir le résultat final - Renvoyer le résultat final
Paramètres :
a(int) : Premier nombreb(int) : Deuxième nombreop_code(int) : Code d’opération (1 pour l’addition, 2 pour la multiplication)
Renvoie : Le résultat après avoir appliqué l’opération deux fois de suite (int)
Exemple : Avec a = 5, b = 3, op_code = 1 (addition) :
- Premier calcul : 5 + 3 = 8
- Deuxième calcul : 8 + 3 = 11
- Renvoyer : 11
Avec a = 2, b = 4, op_code = 2 (multiplication) :
- Premier calcul : 2 × 4 = 8
- Deuxième calcul : 8 × 4 = 32
- Renvoyer : 32
Essayez vous-même
int apply_twice(int a, int b, int op_code) {
// Écrire le code ici
}
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