Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Construisons 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 structure Person avec name (un tableau de caractères de 50 caractères) et age (un entier). Définissez ensuite une structure Student qui intègre Person comme premier membre et ajoute un champ grade (un entier représentant sa note). Déclarez deux fonctions : set_person_age, qui prend un Student* et une nouvelle valeur d’âge, et print_student, qui prend un Student* et affiche toutes les informations.
  • student.c : implémentez les deux fonctions. Votre fonction set_person_age doit modifier l’âge à l’intérieur de la structure Person intégrée. C’est ici que vous allez vous exercer à utiliser la syntaxe flèche puis point (s->person.age). Votre fonction print_student doit 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 variable Student et initialisez tous ses champs. Utilisez ensuite set_person_age pour mettre à jour l’âge de la personne intégrée, puis appelez print_student pour 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: 85

Dans 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;
}
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