Imbrication de struct
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 28 sur 61.
Dans les langages orientés objet comme C++ ou Java, l’héritage permet à une classe d’acquérir des propriétés d’une classe parente. C ne possède pas d’héritage intégré, mais nous pouvons le simuler à l’aide d’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 structure Parent en tant que membre de Child.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Structure embarquée
int grade;
} Child;Ici, Child contient tout ce que Parent possède, ainsi que son propre champ grade. Il s’agit de la composition : l’enfant « possède un » parent plutôt que d’« être un » parent, mais l’effet est similaire à l’héritage.
Pour accéder aux membres du parent via une instance enfant, vous utilisez deux fois l’opérateur point :
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Ce modèle constitue la base de la construction de hiérarchies de types en C. En intégrant une structure de base comme premier membre, nous ouvrons la voie à de puissantes techniques que nous explorerons dans les prochaines leçons.
Défi
FacileConstruisons un système simple de gestion des employés qui démontre l’intégration de structures : le fondement de l’héritage en C.
Vous allez créer une hiérarchie dans laquelle un Employee contient un Person. Cela reflète le fonctionnement de l’héritage : un employé « est un » individu auquel s’ajoutent des informations liées à son poste. En intégrant la structure Person dans Employee, vous obtenez toutes les propriétés de la personne, ainsi que les champs propres à l’employé.
Vous allez organiser votre code dans trois fichiers :
types.h: définissez les deux structures ici avec des gardes d’inclusion. Commencez par créer une structurePersonavec deux champs :name(un tableau de caractères de 50 caractères) etage(un entier). Définissez ensuite une structureEmployeequi intègrePersoncomme premier membre et ajoute un champemployee_id(un entier).types.c: implémentez une fonction appeléeprint_employeequi reçoit un pointeur vers unEmployeeet affiche ses informations. Accédez aux données de la personne intégrée en utilisant la syntaxe en chaîne avec le point et la flèche que vous avez apprise.main.c: créez une variableEmployee, renseignez tous ses champs (y compris le nom et l’âge de la personne intégrée), puis utilisez votre fonction d’affichage pour afficher les informations.
Vous recevrez trois entrées : le nom de l’employé (une chaîne de caractères), son âge (un entier) et son identifiant d’employé (un entier).
Votre fonction print_employee doit afficher les informations de l’employé au format suivant :
Employee: Alice
Age: 28
ID: 1001où Alice est le nom, 28 est l’âge et 1001 est l’identifiant d’employé fourni dans vos entrées.
N’oubliez pas d’accéder aux membres de la structure intégrée par l’intermédiaire du membre parent : par exemple, pour atteindre le nom, vous devez d’abord passer par le membre person.
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: Renseigner le nom et l'âge de la personne embarquée
// Hint: Utilisez strcpy pour le nom, accédez avec employee.person.name
// TODO: Définir l'employee_id
// TODO: Appelez 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 Programmation Orientée Objet
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 cercleImplémentation du rectangleUtilisation polymorpheConteneur de formesEntraînez-vous par vous-même : Compilateur C en ligne