Menu
Coddy logo textTech

Zugriff auf Parent-Member

Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 30 von 61.

Nachdem wir nun die Struct-Einbettung und die Regel für das erste Mitglied verstanden haben, konzentrieren wir uns auf die praktische Seite: Wie liest und ändert man die Daten des eingebetteten Elternteils innerhalb einer Funktion?

Wenn eine Funktion eine Child-Struktur (oder einen Zeiger auf eine solche) empfängt, erfordert der Zugriff auf die Member der übergeordneten Struktur das Navigieren durch die eingebettete Struktur. Die Syntax hängt davon ab, ob du mit einem Wert oder einem Zeiger arbeitest.

typedef struct {
    int id;
    int score;
} Parent;

typedef struct {
    Parent parent;
    char grade;
} Child;

Mit einem Pointer auf Child verwendest du den Pfeiloperator, um zum übergeordneten Objekt zu gelangen, und anschließend den Punktoperator, um auf dessen Member zuzugreifen:

void update_score(Child* c, int new_score) {
    c->parent.score = new_score;  // Pfeil dann Punkt
}

void print_info(Child* c) {
    printf("ID: %d, Score: %d\n", c->parent.id, c->parent.score);
}

Verwende bei einem Wert (per Kopie übergeben) durchgehend Punkte:

void show_id(Child c) {
    printf("ID: %d\n", c.parent.id);  // Punkt dann Punkt
}

Dieses verkettete Zugriffsmuster, child->parent.member oder child.parent.member, zeigt, wie du in C's Kompositionsmodell mit geerbten Daten interagierst. Es ist etwas ausführlicher als echte Vererbung, macht aber die Beziehung zwischen den Typen explizit und verständlich.

challenge icon

Aufgabe

Einfach

Erstellen wir ein Benotungssystem für Studierende, das demonstriert, wie man auf Daten innerhalb einer eingebetteten Struktur zugreift und sie ändert. Du erstellst eine Hierarchie, in der ein Student eine eingebettete Person enthält, und schreibst anschließend Funktionen, die über das Kind mit den Daten des Elternteils arbeiten.

Du organisierst deinen Code über drei Dateien:

  • student.h: Definiere deine Strukturhierarchie mit Include-Schutz. Erstelle eine Person-Struktur mit name (ein Zeichen-Array mit 50 Zeichen) und age (eine Ganzzahl). Definiere anschließend eine Student-Struktur, die Person als erstes Mitglied einbettet und ein grade-Feld (eine Ganzzahl, die die Punktzahl darstellt) hinzufügt. Deklariere zwei Funktionen: set_person_age, die einen Student* und einen neuen Alterswert entgegennimmt, sowie print_student, die einen Student* entgegennimmt und alle Informationen anzeigt.
  • student.c: Implementiere beide Funktionen. Deine Funktion set_person_age soll das Alter innerhalb der eingebetteten Person-Struktur ändern. Hier übst du die Pfeil-dann-Punkt-Syntax (s->person.age). Deine Funktion print_student soll auf alle Felder sowohl der eingebetteten Person als auch des Students selbst zugreifen und sie anzeigen.
  • main.c: Erstelle eine Student-Variable und initialisiere alle ihre Felder. Verwende dann set_person_age, um das Alter der eingebetteten Person zu aktualisieren, und rufe print_student auf, um das Ergebnis anzuzeigen.

Du erhältst vier Eingaben: den Namen des Students (eine Zeichenkette), sein Ausgangsalter (eine Ganzzahl), seine Note (eine Ganzzahl) und ein neues Alter (eine Ganzzahl, die über deine Funktion aktualisiert wird).

Erstelle in deiner Hauptdatei den Student mit den Ausgangswerten, rufe dann set_person_age auf, um das Alter auf den neuen Wert zu ändern, und rufe schließlich print_student auf, um die aktualisierten Informationen anzuzeigen.

Deine Ausgabe sollte so aussehen:

Name: Emma
Age: 21
Grade: 85

Dabei ist Emma der Name, 21 das aktualisierte Alter (nicht das Ausgangsalter) und 85 die Note. Die wichtigste Erkenntnis hier ist, wie man durch die eingebettete Struktur navigiert, um sowohl auf die Mitglieder des Elternteils zuzugreifen als auch sie zu ändern.

Probier es selbst

#include <stdio.h>
#include <string.h>
#include "student.h"

int main() {
    char name[50];
    int initial_age, grade, new_age;
    
    // Eingaben lesen
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Zeilenumbruch entfernen
    scanf("%d", &initial_age);
    scanf("%d", &grade);
    scanf("%d", &new_age);
    
    // TODO: Erstelle eine Student-Variable
    
    // TODO: Initialisiere alle Felder des Students
    // - Kopiere name in den Namen der eingebetteten Person mit strcpy
    // - Setze das Alter der eingebetteten Person auf initial_age
    // - Setze die Note des Students
    
    // TODO: Rufe set_person_age auf, um das Alter auf new_age zu aktualisieren
    
    // TODO: Rufe print_student auf, um das Ergebnis anzuzeigen
    
    return 0;
}
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-C-Compiler