Menu
Coddy logo textTech

Pattern de constructeur

Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 12 sur 61.

Dans des langages comme Java ou C++, vous créez des objets à l’aide de constructeurs : des fonctions spéciales qui allouent automatiquement de la mémoire et initialisent les champs. C ne dispose pas d’une telle fonctionnalité, mais nous pouvons la simuler avec un modèle simple : une fonction create_.

Une fonction constructeur en C effectue généralement trois opérations : alloue de la mémoire avec malloc, initialise tous les champs avec des valeurs appropriées et renvoie un pointeur vers le nouvel objet :

typedef struct {
    char *name;
    int age;
} Person;

Person *create_person(const char *name, int age) {
    Person *p = malloc(sizeof(Person));
    p->name = malloc(strlen(name) + 1);
    strcpy(p->name, name);
    p->age = age;
    return p;
}

La fonction renvoie un pointeur parce que l’objet se trouve dans le tas, et non sur la pile. Cela signifie qu’il persiste après le retour de la fonction et qu’il peut être transmis librement. L’appelant l’utilise ainsi :

Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);

Remarquez comment le constructeur gère tous les détails complexes : allouer la structure, allouer de l’espace pour la chaîne et copier les données. L’appelant fournit simplement les valeurs initiales et reçoit un objet prêt à l’emploi. Cela encapsule la logique de création en un seul endroit, rendant votre code plus propre et moins sujet aux erreurs.

challenge icon

Défi

Facile

Construisons un module Book qui utilise le modèle de constructeur pour créer des objets livre sur le tas. Tu t’exerceras à écrire une fonction create_ qui gère toute l’allocation et l’initialisation de la mémoire, en renvoyant un pointeur prêt à l’emploi.

Tu vas créer trois fichiers :

  • book.h : déclarer une structure Book avec deux membres : char *title (un pointeur vers une chaîne allouée dynamiquement) et int pages. Déclarer également une fonction constructeur create_book qui prend une chaîne représentant le titre et un nombre de pages, puis renvoie un pointeur vers un Book nouvellement créé. Utiliser des gardes d’inclusion avec le symbole BOOK_H.
  • book.c : implémenter la fonction create_book. Ton constructeur doit allouer de la mémoire pour la structure Book elle-même, puis allouer une zone mémoire distincte pour la chaîne du titre (pense à tenir compte du terminateur nul), copier le titre dans la nouvelle zone mémoire, définir le champ pages et renvoyer le pointeur vers le nouveau Book.
  • main.c : utiliser ton constructeur pour créer un livre et afficher ses informations.

Tu recevras deux entrées : le titre du livre (une chaîne) et le nombre de pages (un entier).

Dans ton fichier principal, utilise create_book pour créer un nouveau livre avec les valeurs fournies, puis affiche ses informations dans ce format :

Title: {title}
Pages: {pages}

Par exemple, avec les entrées The C Programming Language et 272, la sortie serait :

Title: The C Programming Language
Pages: 272

N’oublie pas que ton constructeur encapsule toute la logique de création : l’appelant fournit simplement les valeurs initiales et reçoit un objet entièrement initialisé, prêt à l’emploi.

Essayez vous-même

#include <stdio.h>
#include <stdlib.h>
#include "book.h"

int main() {
    char title[256];
    int pages;
    
    // Lire l'entrée
    fgets(title, sizeof(title), stdin);
    // Supprimer le saut de ligne s'il est présent
    for (int i = 0; title[i]; i++) {
        if (title[i] == '\n') {
            title[i] = '\0';
            break;
        }
    }
    scanf("%d", &pages);
    
    // TODO: Utiliser create_book pour créer un nouveau livre avec les valeurs fournies
    
    // TODO: Afficher les informations du livre dans le format requis :
    // Title: {title}
    // Pages: {pages}
    
    // TODO: N'oubliez pas de libérer la mémoire allouée une fois terminé
    
    return 0;
}
quiz iconTestez-vous

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

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