Accès aux membres parents
Fait partie de la section Programmation Orientée Objet du Journey C de Coddy. Leçon 30 sur 61.
Maintenant que nous comprenons l’intégration de structures et la règle du premier membre, concentrons-nous sur l’aspect pratique : comment lire et modifier les données du parent intégré depuis une fonction.
Lorsqu’une fonction reçoit une structure Child (ou un pointeur vers celle-ci), l’accès aux membres du parent nécessite de naviguer dans la structure intégrée. La syntaxe dépend de la question de savoir si vous travaillez avec une valeur ou un pointeur.
typedef struct {
int id;
int score;
} Parent;
typedef struct {
Parent parent;
char grade;
} Child;Avec un pointeur vers Child, utilisez l’opérateur flèche pour atteindre le parent, puis le point pour accéder à ses membres :
void update_score(Child* c, int new_score) {
c->parent.score = new_score; // Flèche puis point
}
void print_info(Child* c) {
printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}Avec une valeur (passée par copie), utilisez des points partout :
void show_id(Child c) {
printf("ID: %d\n", c.parent.id); // Point puis point
}Ce modèle d’accès chaîné, child->parent.member ou child.parent.member, permet d’interagir avec les données héritées dans le modèle de composition de C. Il est légèrement plus verbeux que l’héritage véritable, mais il exprime explicitement et clairement la relation entre les types.
Défi
FacileConstruisons un système de notation des étudiants qui montre comment accéder aux données d’une structure intégrée et les modifier. Vous allez créer une hiérarchie dans laquelle un Student contient un Person intégré, puis écrire des fonctions qui manipulent les données du parent via l’enfant.
Vous allez organiser votre code sur trois fichiers :
student.h: définissez votre hiérarchie de structures avec des protections contre les inclusions multiples. Créez une structurePersonavecname(un tableau de caractères de 50 caractères) etage(un entier). Définissez ensuite une structureStudentqui intègrePersoncomme premier membre et ajoute un champgrade(un entier représentant sa note). Déclarez deux fonctions :set_person_age, qui prend unStudent*et une nouvelle valeur d’âge, etprint_student, qui prend unStudent*et affiche toutes les informations.student.c: implémentez les deux fonctions. Votre fonctionset_person_agedoit modifier l’âge à l’intérieur de la structurePersonintégrée. C’est ici que vous allez vous exercer à utiliser la syntaxe flèche puis point (s->person.age). Votre fonctionprint_studentdoit accéder à tous les champs de la personne intégrée et de l’étudiant lui-même, puis les afficher.main.c: créez une variableStudentet initialisez tous ses champs. Utilisez ensuiteset_person_agepour mettre à jour l’âge de la personne intégrée, puis appelezprint_studentpour afficher le résultat.
Vous recevrez quatre entrées : le nom de l’étudiant (une chaîne de caractères), son âge initial (un entier), sa note (un entier) et un nouvel âge (un entier à mettre à jour via votre fonction).
Dans votre fichier principal, créez l’étudiant avec les valeurs initiales, puis appelez set_person_age pour modifier l’âge et lui attribuer la nouvelle valeur, et enfin appelez print_student pour afficher les informations mises à jour.
Votre sortie devrait ressembler à ceci :
Name: Emma
Age: 21
Grade: 85Dans cet exemple, Emma est le nom, 21 est l’âge mis à jour (et non l’âge initial), et 85 est la note. L’objectif principal est ici d’apprendre à naviguer dans la structure intégrée afin de lire et de modifier les membres de la structure parente.
Essayez vous-même
#include <stdio.h>
#include <string.h>
#include "student.h"
int main() {
char name[50];
int initial_age, grade, new_age;
// Lire les entrées
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Supprimer le saut de ligne
scanf("%d", &initial_age);
scanf("%d", &grade);
scanf("%d", &new_age);
// TODO: Créer une variable Student
// TODO: Initialiser tous les champs de l'étudiant
// - Copier name dans le nom de la personne imbriquée en utilisant strcpy
// - Définir l'âge de la personne imbriquée à initial_age
// - Définir la note de l'étudiant
// TODO: Appeler set_person_age pour mettre à jour l'âge à new_age
// TODO: Appeler print_student pour afficher le résultat
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