Menu
Coddy logo textTech

Aperçu du projet

Fait partie de la section Programmation Orientée Objet 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 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 structure Shape. Définissez ensuite 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 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 : affiche Drawing test shape
    • test_area : renvoie 42.0
    Créez une instance de 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.0

Pourquoi 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

Entraînez-vous par vous-même : Compilateur C en ligne