Typedef pour les pointeurs sur fonctions
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 35 sur 61.
Comme vous l’avez vu, les déclarations de pointeurs de fonction peuvent être difficiles à lire. Lorsque vous devez utiliser le même type de pointeur de fonction à plusieurs endroits, la syntaxe devient répétitive et source d’erreurs. C’est là que typedef vient à la rescousse.
Le mot-clé typedef vous permet de créer un alias pour n’importe quel type, y compris les pointeurs de fonction. Au lieu d’écrire la déclaration complète à chaque fois, vous définissez le type une fois et utilisez l’alias dans tout votre code.
Voici comment transformer une déclaration de pointeur de fonction en typedef :
// Sans typedef (désordonné) :
int (*operation)(int, int);
// Avec typedef (propre) :
typedef int (*Operation)(int, int);
Operation op; // Beaucoup plus propre !La syntaxe reflète une déclaration classique de pointeur de fonction, mais avec typedef au début. Le nom que vous choisissez (ici, Operation) devient un nouveau type qui représente « un pointeur vers une fonction prenant deux entiers et renvoyant un entier ».
Vous pouvez maintenant utiliser ce type n’importe où :
typedef int (*Operation)(int, int);
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
Operation op1 = add;
Operation op2 = multiply;
printf("%d\n", op1(3, 4)); // Sortie : 7
printf("%d\n", op2(3, 4)); // Sortie : 12
return 0;
}Cette approche est particulièrement précieuse lorsque vous passez des pointeurs de fonction en tant que paramètres ou que vous les stockez dans des structures : des situations que vous rencontrerez fréquemment à mesure que nous nous dirigeons vers le polymorphisme.
Défi
FacileEntraînons-nous à utiliser typedef pour créer un alias clair pour un type de pointeur vers une fonction de comparaison. Vous définirez un type représentant une fonction qui compare deux entiers, puis vous l'utiliserez pour déclarer des variables et appeler différentes fonctions de comparaison.
Écrivez un programme qui :
- Crée un
typedefappeléComparatorpour un type de pointeur vers une fonction qui :- Prend deux paramètres de type
int - Retourne un
int(négatif si le premier est plus petit, zéro s'ils sont égaux, positif si le premier est plus grand)
- Prend deux paramètres de type
- Définit deux fonctions de comparaison :
ascending: retourne une valeur indiquant l'ordre croissant (first - second)descending: retourne une valeur indiquant l'ordre décroissant (second - first)
- Dans
main, déclare une variableComparator(en utilisant votre typedef, et non la syntaxe brute d'un pointeur vers une fonction) - Lit trois entrées : deux entiers et un code d'ordre (1 pour l'ordre croissant, 2 pour l'ordre décroissant)
- Attribue la fonction appropriée à votre variable
Comparatoren fonction du code d'ordre - Appelle le comparateur avec les deux nombres et affiche le résultat, suivi d'un message indiquant quelle valeur doit apparaître en premier
Vous recevrez trois entrées : le premier nombre, le second nombre et le code d'ordre (1 ou 2).
Votre sortie doit afficher le résultat de la comparaison, puis indiquer quel nombre apparaît en premier en fonction du signe du résultat :
Result: -5
First: 3Dans cet exemple, avec les entrées 3, 8, 1 (ordre croissant), la comparaison retourne 3 - 8 = -5 (une valeur négative signifie que le premier nombre apparaît en premier dans l'ordre croissant), nous affichons donc First: 3.
Pour la ligne « First » :
- Si le résultat est négatif ou nul, affichez le premier nombre saisi
- Si le résultat est positif, affichez le second nombre saisi
L'objectif principal de cet exercice est d'utiliser votre typedef Comparator pour déclarer proprement la variable, plutôt que d'écrire la syntaxe complète d'un pointeur vers une fonction.
Essayez vous-même
#include <stdio.h>
// TODO: Créer un typedef appelé 'Comparator' pour un type de pointeur de fonction
// qui prend deux paramètres int et retourne un int
// TODO: Définir la fonction de comparaison 'ascending'
// Doit retourner (first - second)
// TODO: Définir la fonction de comparaison 'descending'
// Doit retourner (second - first)
int main() {
// Lire l'entrée
int num1, num2, orderCode;
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &orderCode);
// TODO: Déclarer une variable Comparator en utilisant votre typedef
// TODO: Assigner la fonction appropriée selon orderCode
// (1 pour ascending, 2 pour descending)
// TODO: Appeler le comparateur et stocker le résultat
int result;
// Afficher le résultat
printf("Result: %d\n", result);
// TODO: Afficher quel nombre vient en premier en fonction du résultat
// Si le résultat est négatif ou zéro, afficher le premier nombre
// Si le résultat est positif, afficher le second nombre
printf("First: %d\n", /* votre logique ici */ 0);
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