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.
Wyzwanie
ŁatwyZbudujmy 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ęPersonz dwoma polami:name(tablica znaków o długości 50 znaków) iage(liczba całkowita). Następnie zdefiniuj strukturęEmployee, która osadzaPersonjako swój pierwszy element i dodaje poleemployee_id(liczbę całkowitą).types.c: Zaimplementuj funkcję o nazwieprint_employee, która przyjmuje wskaźnik doEmployeei 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ą typuEmployee, 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: 1001Gdzie 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;
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania modularnego
Pliki nagłówkoweZabezpieczenia przed wielokrotnym dołączeniemPliki źródłoweFunkcje statycznePodsumowanie: kalkulator modularny4Enkapsulacja
Koncepcja niejawnych wskaźnikówDefiniowanie niejawnych strukturGettery i setteryWalidacja w setterachPowtórka: tajemnicze pudełko2Obiekty i metody
Struktury jako obiektyWskaźnik „self”Poprawność constWskaźnik czy wartośćMetody pomocniczePodsumowanie: menedżer punktów5Projekt: Proste konto bankowe
Konfiguracja projektuImplementacja konta8Polimorfizm
Wskaźniki do funkcji w strukturachSymulowanie metodKoncepcja interfejsuImplementowanie interfejsówIteracja polimorficznaPodsumowanie: Greeter11Wzorce projektowe w C
Wzorzec SingletonWzorzec fabrykiWzorzec iteratoraPodsumowanie: fabryka loggera3Cykl życia obiektu
Wzorzec konstruktoraWzorzec destruktoraInicjalizacja na stosieKopia głębokaPodsumowanie: klasa opakowująca ciąg znaków6Dziedziczenie przez kompozycję
Osadzanie strukturZasada pierwszego elementuDostęp do elementów klasy nadrzędnejKonwersja w górę hierarchiiPodsumowanie: hierarchia kształtów9Projekt: Rysownik kształtów
Przegląd projektuImplementacja kołaImplementacja prostokątaZastosowanie polimorfizmuKontener kształtówPoćwicz samodzielnie: Kompilator C online