Menu
Coddy logo textTech

Osadzanie struktur

Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 28 z 61.

W językach obiektowych, takich jak C++ czy Java, dziedziczenie pozwala klasie przejmować właściwości klasy nadrzędnej. C nie ma wbudowanego mechanizmu dziedziczenia, ale możemy go zasymulować za pomocą techniki zwanej kompozycją: umieszczając jedną strukturę wewnątrz drugiej.

Pomysł jest prosty: jeśli Child potrzebuje wszystkich właściwości Parent, osadzamy strukturę Parent jako składową Child.

typedef struct {
    int id;
    char name[50];
} Parent;

typedef struct {
    Parent parent;  // Osadzona struktura
    int grade;
} Child;

Tutaj Child zawiera wszystko, co ma Parent, a także własne pole grade. To jest kompozycja: dziecko „ma” rodzica, zamiast „być” rodzicem, ale efekt jest podobny do dziedziczenia.

Aby uzyskać dostęp do składowych klasy nadrzędnej za pośrednictwem instancji klasy potomnej, użyj dwukrotnie operatora kropki:

Child c;
c.parent.id = 101;
c.parent.name[0] = 'A';
c.grade = 5;

Ten wzorzec stanowi podstawę budowania hierarchii typów w C. Osadzając bazową strukturę jako pierwszy element, otwieramy sobie drogę do zaawansowanych technik, które omówimy w kolejnych lekcjach.

challenge icon

Wyzwanie

Łatwy

Zbudujmy prosty system zarządzania pracownikami, który pokazuje osadzanie struktur: podstawę dziedziczenia w C.

Utworzysz hierarchię, w której Employee zawiera Person. Odzwierciedla to działanie dziedziczenia: pracownik „jest” osobą z dodatkowymi informacjami związanymi z pracą. Osadzając strukturę Person wewnątrz Employee, uzyskasz wszystkie właściwości osoby oraz pola charakterystyczne dla pracownika.

Rozmieścisz swój kod w trzech plikach:

  • types.h: Zdefiniuj tutaj obie struktury z osłonami dołączania. Najpierw utwórz strukturę Person z dwoma polami: name (tablica znaków o długości 50 znaków) i age (liczba całkowita). Następnie zdefiniuj strukturę Employee, która osadza Person jako swój pierwszy element i dodaje pole employee_id (liczbę całkowitą).
  • types.c: Zaimplementuj funkcję o nazwie print_employee, która przyjmuje wskaźnik do Employee i wyświetla informacje o pracowniku. Uzyskaj dostęp do danych osadzonej osoby, używając poznanej składni łańcuchowej z kropką i strzałką.
  • main.c: Utwórz zmienną typu Employee, wypełnij wszystkie jej pola (w tym imię i wiek osadzonej osoby) i użyj funkcji wyświetlającej, aby pokazać te informacje.

Otrzymasz trzy dane wejściowe: imię pracownika (ciąg znaków), jego wiek (liczbę całkowitą) oraz identyfikator pracownika (liczbę całkowitą).

Funkcja print_employee powinna wyświetlać informacje o pracowniku w tym formacie:

Employee: Alice
Age: 28
ID: 1001

Gdzie Alice to imię, 28 to wiek, a 1001 to identyfikator pracownika z danych wejściowych.

Pamiętaj, aby uzyskiwać dostęp do składowych osadzonej struktury za pośrednictwem składowej nadrzędnej. Na przykład, aby dotrzeć do imienia, najpierw przejdź przez składową person.

Spróbuj swoich sił

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

int main() {
    // Wczytaj dane wejściowe
    char name[50];
    int age;
    int employee_id;
    
    fgets(name, 50, stdin);
    name[strcspn(name, "\n")] = '\0';  // Usuń znak nowej linii
    scanf("%d", &age);
    scanf("%d", &employee_id);
    
    // TODO: Utwórz zmienną typu Employee
    
    // TODO: Uzupełnij imię i wiek osoby zawartej w strukturze
    // Wskazówka: Użyj strcpy do skopiowania imienia; uzyskaj do niego dostęp przez employee.person.name
    
    // TODO: Ustaw employee_id
    
    // TODO: Wywołaj print_employee, przekazując wskaźnik do utworzonej zmiennej typu Employee
    
    return 0;
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online