Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Lassen 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 ein Person-Struct mit zwei Feldern: name (ein Zeichen-Array von 50 Zeichen) und age (ein Integer). Definieren Sie dann ein Employee-Struct, das Person als sein erstes Mitglied einbettet und ein employee_id-Feld (ein Integer) hinzufügt.
  • types.c: Implementieren Sie eine Funktion namens print_employee, die einen Pointer auf einen Employee entgegennimmt 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 eine Employee-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: 1001

Wobei 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;
}
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 Object Oriented Programming