Struct-Einbettung
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 28 von 61.
In objektorientierten Sprachen wie C++ oder Java ermöglicht Vererbung einer Klasse, Eigenschaften von einer übergeordneten Klasse zu übernehmen. C verfügt nicht über eine integrierte Vererbung, aber wir können sie mithilfe einer Technik namens Komposition simulieren: indem wir eine Struktur in eine andere einfügen.
Die Idee ist einfach: Wenn ein Child alle Eigenschaften eines Parent benötigt, betten wir die Struktur Parent als Mitglied von Child ein.
typedef struct {
int id;
char name[50];
} Parent;
typedef struct {
Parent parent; // Eingebettetes Struct
int grade;
} Child;Hier enthält Child alles, was Parent hat, sowie sein eigenes Feld grade. Dies ist Komposition: Das Kind „hat einen“ Parent, anstatt „ein“ Parent zu sein, aber der Effekt ähnelt der Vererbung.
Um über eine untergeordnete Instanz auf die Member des übergeordneten Elements zuzugreifen, verwendest du zweimal den Punktoperator:
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. Indem wir eine Basisstruktur als first member einbetten, erschließen wir leistungsstarke Techniken, die wir in den kommenden Lektionen erkunden werden.
Aufgabe
EinfachErstellen wir ein einfaches Mitarbeiterverwaltungssystem, das die Einbettung von Strukturen demonstriert: die Grundlage der Vererbung in C.
Du erstellst eine Hierarchie, in der ein Employee einen Person enthält. Dies spiegelt wider, wie Vererbung funktioniert: Ein Mitarbeiter „ist ein“ Person-Objekt mit zusätzlichen arbeitsbezogenen Informationen. Indem du die Struktur Person in Employee einbettest, erhältst du alle Eigenschaften der Person sowie die mitarbeiterspezifischen Felder.
Du organisierst deinen Code auf drei Dateien verteilt:
types.h: Definiere hier beide Strukturen mit Include-Schutz. Erstelle zuerst einePerson-Struktur mit zwei Feldern:name(ein Zeichenarray mit 50 Zeichen) undage(eine Ganzzahl). Definiere anschließend eineEmployee-Struktur, diePersonals erstes Mitglied einbettet und ein Feldemployee_id(eine Ganzzahl) hinzufügt.types.c: Implementiere eine Funktion namensprint_employee, die einen Zeiger auf einenEmployeeentgegennimmt und dessen Informationen ausgibt. Greife mithilfe der verketteten Punkt-/Pfeil-Syntax, die du gelernt hast, auf die Daten der eingebetteten Person zu.main.c: Erstelle eineEmployee-Variable, befülle alle ihre Felder (einschließlich des Namens und Alters der eingebetteten Person) und verwende deine Ausgabefunktion, um die Informationen anzuzeigen.
Du erhältst drei Eingaben: den Namen des Mitarbeiters (eine Zeichenkette), sein Alter (eine Ganzzahl) und seine Mitarbeiter-ID (eine Ganzzahl).
Deine Funktion print_employee sollte die Informationen des Mitarbeiters in folgendem Format ausgeben:
Employee: Alice
Age: 28
ID: 1001Dabei ist Alice der Name, 28 das Alter und 1001 die Mitarbeiter-ID aus deinen Eingaben.
Denke daran, auf die Mitglieder der eingebetteten Struktur über das übergeordnete Mitglied zuzugreifen. Um beispielsweise den Namen zu erreichen, navigierst du zuerst über das Mitglied person.
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: Befülle den Namen und das Alter der eingebetteten Person
// Hinweis: Verwende strcpy für den Namen, Zugriff mit employee.person.name
// TODO: Setze die employee_id
// TODO: Rufe print_employee mit einem Zeiger 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 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