Aperçu du projet
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 44 sur 61.
Défi
FacilePosons les bases du projet Shape Drawer en créant la structure Shape de base : une interface qui définit ce que toute forme peut faire au moyen de pointeurs de fonction.
Vous allez créer deux fichiers pour mettre en place ce système polymorphe :
shape.h: définissez ici l’interface principale. Commencez par créer une déclaration anticipée de la structureShape. Définissez ensuite 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 uniquement comme une interface. Elle ne contient aucune donnée spécifique à une forme, seulement son comportement.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, associez-la à ces fonctions de test, puis appelez-les toutes les deux via l’interface. Affichez le résultat de l’aire avec une décimale.
Votre sortie doit 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 soit entièrement définie. Cela 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 suffit pour utiliser un pointeur vers celle-ci. La définition complète vient plus tard. Ce modèle est courant en C lorsqu’une structure doit faire référence à elle-même (directement ou par l’intermédiaire de pointeurs de fonction).
L’idée essentielle ici est que Shape ne sait rien des cercles ou des rectangles. Elle sait seulement que toute forme doit pouvoir se draw elle-même et calculer son area. Dans les prochaines leçons, vous créerez des formes concrètes qui intégreront cette structure de base et fourniront leurs propres implémentations. N’oubliez pas d’utiliser des gardes d’inclusion 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*
// - Prints "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: Connecter 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 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è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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne