Imbrication de struct
Fait partie de la section Object Oriented Programming du Journey C de Coddy — leçon 28 sur 61.
Dans les langages orientés objet comme le C++ ou le Java, l'héritage permet à une classe d'acquérir les propriétés d'une classe parente. Le C ne possède pas d'héritage intégré, mais nous pouvons le simuler en utilisant une technique appelée composition — placer une struct à l'intérieur d'une autre.
L'idée est simple : si un Child a besoin de toutes les propriétés d'un Parent, nous intégrons la struct Parent en tant que membre de Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Structure imbriquée
int grade;
} Child;Ici, Child contient tout ce que Parent possède, plus son propre champ grade. C'est de la composition — l'enfant « a un » parent plutôt qu'il « est un » parent, mais l'effet est similaire à l'héritage.
Pour accéder aux membres du parent via une instance enfant, vous utilisez l'opérateur point deux fois :
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Ce modèle constitue le fondement de la création de hiérarchies de types en C. En imbriquant une struct de base comme premier membre, nous débloquons des techniques puissantes que nous explorerons dans les prochaines leçons.
Défi
FacileConstruisons un système simple de gestion des employés qui démontre l'imbrication de structures—le fondement de l'héritage en C.
Vous allez créer une hiérarchie où un Employee contient une Person. Cela reflète le fonctionnement de l'héritage : un employé "est une" personne avec des informations supplémentaires liées au travail. En imbriquant la structure Person à l'intérieur de Employee, vous obtenez toutes les propriétés de la personne plus les champs spécifiques à l'employé.
Vous organiserez votre code sur trois fichiers :
types.h: Définissez les deux structures ici avec des gardes d'inclusion. Tout d'abord, créez une structurePersonavec deux champs :name(un tableau de 50 caractères) etage(un entier). Ensuite, définissez une structureEmployeequi imbriquePersoncomme premier membre et ajoute un champemployee_id(un entier).types.c: Implémentez une fonction appeléeprint_employeequi prend un pointeur vers unEmployeeet affiche ses informations. Accédez aux données de la personne imbriquée en utilisant la syntaxe chaînée point/flèche que vous avez apprise.main.c: Créez une variableEmployee, remplissez tous ses champs (y compris le nom et l'âge de la personne imbriquée), et utilisez votre fonction d'affichage pour présenter les informations.
Vous recevrez trois entrées : le nom de l'employé (une chaîne de caractères), son âge (un entier) et son ID d'employé (un entier).
Votre fonction print_employee doit afficher les informations de l'employé dans ce format :
Employee: Alice
Age: 28
ID: 1001Où Alice est le nom, 28 est l'âge, et 1001 est l'ID de l'employé provenant de vos entrées.
N'oubliez pas d'accéder aux membres de la structure imbriquée via le membre parent—par exemple, pour atteindre le nom, vous naviguerez d'abord par le membre person.
Aide-mémoire
Le C ne possède pas d'héritage intégré, mais vous pouvez le simuler en utilisant la composition — l'imbrication d'une structure à l'intérieur d'une autre.
Pour créer une relation parent-enfant, imbriquez la structure parente en tant que membre de la structure enfant :
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Embedded struct
int grade;
} Child;La structure enfant contient toutes les propriétés du parent, plus ses propres champs supplémentaires. Cela représente une relation de type « a un » (has a).
Pour accéder aux membres de la structure imbriquée, utilisez l'opérateur point deux fois :
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Lorsque vous travaillez avec des pointeurs, utilisez l'opérateur flèche pour accéder aux membres de la structure imbriquée :
Child *ptr = &c;
ptr->parent.id = 101;
ptr->grade = 5;L'imbrication de la structure de base en tant que premier membre est un modèle courant qui permet des techniques avancées pour construire des hiérarchies de types en C.
Essayez vous-même
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Lire l'entrée
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Supprimer le saut de ligne
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Créer une variable Employee
// TODO: Remplir le nom et l'âge de la personne imbriquée
// Hint: Utiliser strcpy pour le nom, accéder avec employee.person.name
// TODO: Définir l'employee_id
// TODO: Appeler print_employee avec un pointeur vers votre employee
return 0;
}
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
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