Récapitulatif : La boîte secrète
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 21 sur 61.
Défi
FacileConstruisons un module Box qui démontre une encapsulation complète. Votre boîte aura trois dimensions cachées — largeur, hauteur et profondeur — qui ne peuvent être accédées que par les fonctions que vous fournissez. C'est le modèle du pointeur opaque (opaque pointer pattern) en action !
Vous allez créer trois fichiers :
box.h: Votre interface publique. Déclarez un typeBoxopaque en utilisant uniquement une déclaration anticipée (forward declaration) — le corps de la structure reste caché. Déclarez ces fonctions :create_box— prend trois entiers (largeur, hauteur, profondeur) et retourne un pointeur Boxdestroy_box— libère la mémoire allouéeget_volume— prend unconst Box *et retourne le volume (largeur × hauteur × profondeur)set_dimensions— prend un pointeur Box et trois nouvelles valeurs de dimension, retourne unint(1 pour le succès, 0 si une dimension est négative ou nulle)
BOX_H.box.c: Définissez la structure réellestruct Boxavec trois membres cachés :int width,int height, etint depth. Implémentez les quatre fonctions. Votre constructeur doit allouer et initialiser la boîte. La fonctionset_dimensionsdoit valider que les trois valeurs sont positives (supérieures à zéro) avant d'appliquer les changements — si une valeur échoue à la validation, rejetez l'ensemble de la mise à jour et retournez 0.main.c: Démontrez votre boîte encapsulée en en créant une, en vérifiant son volume, en tentant des changements de dimensions (valides et invalides), et en nettoyant correctement.
Vous recevrez cinq entrées : la largeur initiale, la hauteur initiale, la profondeur initiale, suivies de trois nouvelles dimensions à tenter de définir (qui peuvent inclure des valeurs invalides).
Dans votre fichier principal, créez une Box avec les dimensions initiales et affichez son volume. Tentez ensuite de définir les nouvelles dimensions — affichez si la mise à jour a réussi et le volume résultant. Enfin, libérez la boîte et confirmez le nettoyage.
Affichez la sortie dans ce format :
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedPar exemple, avec les entrées 2, 3, 4, 5, 5, 5, la sortie serait :
Volume: 24
Set: 1
Volume: 125
DestroyedAvec les entrées 2, 3, 4, -1, 5, 5, la sortie serait :
Volume: 24
Set: 0
Volume: 24
DestroyedRemarquez comment la validation dans set_dimensions protège votre boîte des états invalides — le code externe ne peut pas contourner vos règles car les dimensions sont complètement cachées derrière votre interface.
Essayez vous-même
#include <stdio.h>
#include "box.h"
int main() {
// Lire les dimensions initiales
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Lire les nouvelles dimensions à tenter
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Créer une Box avec les dimensions initiales
// TODO: Afficher le volume initial au format : "Volume: {volume}"
// TODO: Tenter de définir de nouvelles dimensions et stocker le résultat
// TODO: Afficher si la modification a réussi au format : "Set: {0 or 1}"
// TODO: Afficher le volume résultant au format : "Volume: {volume}"
// TODO: Détruire la box et afficher "Destroyed"
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