Aperçu du projet
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 44 sur 61.
Défi
FacilePosons les bases du projet Shape Drawer en créant la structure de base Shape — une interface qui définit ce que n'importe quelle forme peut faire grâce à des pointeurs de fonction.
Vous allez créer deux fichiers pour mettre en place ce système polymorphe :
shape.h: Définissez l'interface principale ici. Tout d'abord, créez une déclaration anticipée (forward declaration) pour la structureShape. Ensuite, définissez deux types de pointeurs de fonction :DrawFunc— prend un paramètreconst Shape*et ne renvoie rienAreaFunc— prend un paramètreconst Shape*et renvoie undouble
Shapeelle-même contenant deux pointeurs de fonction :draw(de typeDrawFunc) etarea(de typeAreaFunc). Cette structure agit purement comme une interface — elle ne contient aucune donnée spécifique à une forme, seulement des comportements.main.c: Démontrez que votre interface fonctionne en créant une forme de test simple. Implémentez deux fonctions :test_draw— afficheDrawing test shapetest_area— renvoie42.0
Shape, liez-la à ces fonctions de test, puis appelez les deux via l'interface. Affichez le résultat de l'aire avec une décimale.
Votre sortie devrait démontrer que les pointeurs de fonction fonctionnent correctement :
Drawing test shape
Area: 42.0Pourquoi la déclaration anticipée ? Vous vous demandez peut-être pourquoi typedef struct Shape Shape; apparaît avant que la structure ne soit complètement définie. C'est nécessaire parce que DrawFunc et AreaFunc font référence à const Shape* dans leurs types de paramètres — mais à ce stade du fichier, le compilateur n'a pas encore vu la définition complète de la structure. La déclaration anticipée indique au compilateur : "une structure nommée Shape existe", ce qui est suffisant pour utiliser un pointeur vers celle-ci. La définition complète suit plus tard. Ce modèle est courant en C chaque fois qu'une structure doit se référencer elle-même (directement ou via des pointeurs de fonction).
L'idée clé ici est que Shape ne sait rien des cercles ou des rectangles — elle sait seulement que n'importe quelle forme doit être capable de se dessiner (draw) et de calculer son aire (area). Dans les prochaines leçons, vous créerez des formes concrètes qui intègrent cette structure de base et fournissent leurs propres implémentations. N'oubliez pas d'utiliser des gardes d'inclusion (include guards) dans votre fichier d'en-tête.
Essayez vous-même
#include <stdio.h>
#include "shape.h"
// TODO: Implémenter la fonction test_draw
// - Prend un paramètre const Shape*
// - Affiche "Drawing test shape"
void test_draw(const Shape* shape) {
// TODO: Afficher le message requis
}
// TODO: Implémenter la fonction test_area
// - Prend un paramètre const Shape*
// - Retourne 42.0
double test_area(const Shape* shape) {
// TODO: Retourner la valeur de l'aire de test
}
int main() {
// TODO: Créer une instance de Shape
// TODO: Lier la forme aux fonctions test_draw et test_area
// TODO: Appeler draw via l'interface
// TODO: Appeler area via l'interface et afficher avec une décimale
// Format: "Area: %.1f\n"
return 0;
}
Toutes les leçons de Object Oriented Programming
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ète2Objets 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 cercle