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.
Aufgabe
EinfachErstellen 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 einePerson-Struktur mitname(ein Zeichen-Array mit 50 Zeichen) undage(eine Ganzzahl). Definiere anschließend eineStudent-Struktur, diePersonals erstes Mitglied einbettet und eingrade-Feld (eine Ganzzahl, die die Punktzahl darstellt) hinzufügt. Deklariere zwei Funktionen:set_person_age, die einenStudent*und einen neuen Alterswert entgegennimmt, sowieprint_student, die einenStudent*entgegennimmt und alle Informationen anzeigt.student.c: Implementiere beide Funktionen. Deine Funktionset_person_agesoll das Alter innerhalb der eingebettetenPerson-Struktur ändern. Hier übst du die Pfeil-dann-Punkt-Syntax (s->person.age). Deine Funktionprint_studentsoll auf alle Felder sowohl der eingebetteten Person als auch des Students selbst zugreifen und sie anzeigen.main.c: Erstelle eineStudent-Variable und initialisiere alle ihre Felder. Verwende dannset_person_age, um das Alter der eingebetteten Person zu aktualisieren, und rufeprint_studentauf, 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: 85Dabei 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;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler