Menu
Coddy logo textTech

Aperçu du projet

Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 44 sur 61.

challenge icon

Défi

Facile

Posons 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 structure Shape. Ensuite, définissez deux types de pointeurs de fonction :
    • DrawFunc — prend un paramètre const Shape* et ne renvoie rien
    • AreaFunc — prend un paramètre const Shape* et renvoie un double
    Enfin, définissez la structure Shape elle-même contenant deux pointeurs de fonction : draw (de type DrawFunc) et area (de type AreaFunc). 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 — affiche Drawing test shape
    • test_area — renvoie 42.0
    Créez une instance de 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.0

Pourquoi 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