Struct-Einbettung
Teil des Abschnitts Object Oriented Programming der C-Journey von Coddy — Lektion 28 von 61.
In objektorientierten Sprachen wie C++ oder Java ermöglicht Vererbung einer Klasse, Eigenschaften von einer Elternklasse zu übernehmen. C verfügt über keine integrierte Vererbung, aber wir können sie mit einer Technik namens Komposition simulieren – indem wir ein struct in ein anderes einfügen.
Die Idee ist einfach: Wenn ein Child alle Eigenschaften eines Parent benötigt, betten wir das Parent-Struct als Mitglied von Child ein.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Eingebettete Struktur
int grade;
} Child;Hier enthält Child alles, was Parent hat, plus sein eigenes grade-Feld. Dies ist Komposition — das Kind „hat einen“ Elternteil, anstatt ein Elternteil „zu sein“, aber der Effekt ist ähnlich wie bei der Vererbung.
Um auf die Member des Parent-Objekts über eine Child-Instanz zuzugreifen, verwenden Sie den Punkt-Operator zweimal:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Dieses Muster bildet die Grundlage für den Aufbau von Typhierarchien in C. Durch das Einbetten eines Basis-structs als erstes Element erschließen wir leistungsstarke Techniken, die wir in den kommenden Lektionen untersuchen werden.
Aufgabe
EinfachLassen Sie uns ein einfaches Mitarbeiterverwaltungssystem erstellen, das das Einbetten von Structs demonstriert – die Grundlage der Vererbung in C.
Sie werden eine Hierarchie erstellen, in der ein Employee eine Person enthält. Dies spiegelt wider, wie Vererbung funktioniert: Ein Mitarbeiter "ist eine" Person mit zusätzlichen berufsbezogenen Informationen. Durch das Einbetten des Person-Structs in Employee erhalten Sie alle Eigenschaften der Person plus die mitarbeiterspezifischen Felder.
Sie werden Ihren Code auf drei Dateien verteilen:
types.h: Definieren Sie hier beide Structs mit Include-Guards. Erstellen Sie zuerst einPerson-Struct mit zwei Feldern:name(ein Zeichen-Array von 50 Zeichen) undage(ein Integer). Definieren Sie dann einEmployee-Struct, dasPersonals sein erstes Mitglied einbettet und einemployee_id-Feld (ein Integer) hinzufügt.types.c: Implementieren Sie eine Funktion namensprint_employee, die einen Pointer auf einenEmployeeentgegennimmt und dessen Informationen ausgibt. Greifen Sie auf die Daten der eingebetteten Person mit der verketteten Punkt-/Pfeilsyntax zu, die Sie gelernt haben.main.c: Erstellen Sie eineEmployee-Variable, füllen Sie alle ihre Felder aus (einschließlich Name und Alter der eingebetteten Person) und verwenden Sie Ihre Print-Funktion, um die Informationen anzuzeigen.
Sie erhalten drei Eingaben: den name des Mitarbeiters (ein String), sein age (ein Integer) und seine employee ID (ein Integer).
Ihre print_employee-Funktion sollte die Informationen des Mitarbeiters in diesem Format ausgeben:
Employee: Alice
Age: 28
ID: 1001Wobei Alice der Name, 28 das Alter und 1001 die Mitarbeiter-ID aus Ihren Eingaben ist.
Denken Sie daran, auf die Mitglieder des eingebetteten Structs über das übergeordnete Mitglied zuzugreifen – um beispielsweise den Namen zu erreichen, navigieren Sie zuerst durch das person-Mitglied.
Spickzettel
C verfügt nicht über eine integrierte Vererbung, aber Sie können diese mithilfe von Komposition simulieren — indem Sie eine Struktur in eine andere einbetten.
Um eine Eltern-Kind-Beziehung zu erstellen, betten Sie die Eltern-Struktur als Mitglied der Kind-Struktur ein:
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Eingebettete Struktur
int grade;
} Child;Die Kind-Struktur enthält alle Eigenschaften der Eltern-Struktur sowie ihre eigenen zusätzlichen Felder. Dies stellt eine „hat ein“-Beziehung dar.
Um auf Mitglieder der eingebetteten Struktur zuzugreifen, verwenden Sie den Punkt-Operator zweimal:
Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;Wenn Sie mit Pointern arbeiten, verwenden Sie den Pfeil-Operator, um auf die Mitglieder der eingebetteten Struktur zuzugreifen:
Child *ptr = &c;
ptr->parent.id = 101;
ptr->grade = 5;Das Einbetten der Basis-Struktur als erstes Mitglied ist ein gängiges Muster, das fortgeschrittene Techniken zum Aufbau von Typhierarchien in C ermöglicht.
Probier es selbst
#include <stdio.h>
#include <string.h>
#include "types.h"
int main() {
// Eingabe lesen
char name[50];
int age;
int employee_id;
fgets(name, 50, stdin);
name[strcspn(name, "\n")] = '\0'; // Zeilenumbruch entfernen
scanf("%d", &age);
scanf("%d", &employee_id);
// TODO: Erstelle eine Employee Variable
// TODO: Fülle den Namen und das Alter der eingebetteten Person aus
// Hint: Verwende strcpy für den Namen, greife mit employee.person.name zu
// TODO: Setze die employee_id
// TODO: Rufe print_employee mit einem Pointer auf deinen employee auf
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Object Oriented Programming
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-Implementierung