Wzorzec konstruktora
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 12 z 61.
W językach takich jak Java czy C++ tworzysz obiekty za pomocą konstruktorów: specjalnych funkcji, które automatycznie przydzielają pamięć i inicjalizują pola. C nie ma takiej funkcji, ale możemy ją zasymulować za pomocą prostego wzorca: funkcji create_.
Funkcja konstruktora w języku C zazwyczaj wykonuje trzy czynności: alokuje pamięć za pomocą malloc, inicjalizuje wszystkie pola odpowiednimi wartościami i zwraca wskaźnik do nowego obiektu:
typedef struct {
char *name;
int age;
} Person;
Person *create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
p->name = malloc(strlen(name) + 1);
strcpy(p->name, name);
p->age = age;
return p;
}
Funkcja zwraca wskaźnik, ponieważ obiekt znajduje się na stercie, a nie na stosie. Oznacza to, że pozostaje on dostępny po zakończeniu działania funkcji i można go swobodnie przekazywać. Wywołujący używa go w następujący sposób:
Person *alice = create_person("Alice", 30);
printf("%s is %d years old\n", alice->name, alice->age);
Zwróć uwagę, jak konstruktor obsługuje wszystkie kłopotliwe szczegóły: przydzielanie pamięci dla struktury, przydzielanie miejsca na ciąg znaków i kopiowanie danych. Wywołujący po prostu podaje wartości początkowe i otrzymuje gotowy do użycia obiekt. Dzięki temu logika tworzenia jest zamknięta w jednym miejscu, a Twój kod jest czytelniejszy i mniej podatny na błędy.
Wyzwanie
ŁatwyZbudujmy moduł Book, który używa wzorca konstruktora do tworzenia obiektów książek na stercie. Poćwiczysz pisanie funkcji create_, która zajmuje się całą alokacją i inicjalizacją pamięci, a następnie zwraca gotowy do użycia wskaźnik.
Utworzysz trzy pliki:
book.h: Zadeklaruj strukturęBookz dwoma polami:char *title(wskaźnik do dynamicznie alokowanego ciągu znaków) orazint pages. Zadeklaruj także funkcję konstruktoracreate_book, która przyjmuje ciąg znaków z tytułem i liczbę stron, a następnie zwraca wskaźnik do nowo utworzonej książki Book. Użyj strażników ochronnych z symbolemBOOK_H.book.c: Zaimplementuj funkcjęcreate_book. Twój konstruktor powinien zaalokować pamięć na samą strukturę Book, a następnie osobną pamięć na ciąg znaków z tytułem (pamiętaj o uwzględnieniu znaku null), skopiować tytuł do nowej pamięci, ustawić pole pages i zwrócić wskaźnik do nowej książki Book.main.c: Użyj konstruktora, aby utworzyć książkę i wyświetlić jej informacje.
Otrzymasz dwa dane wejściowe: tytuł książki (ciąg znaków) oraz liczbę stron (liczbę całkowitą).
W pliku main użyj funkcji create_book, aby utworzyć nową książkę z podanymi wartościami, a następnie wyświetl jej informacje w tym formacie:
Title: {title}
Pages: {pages}Na przykład dla danych wejściowych The C Programming Language i 272 wynik będzie następujący:
Title: The C Programming Language
Pages: 272Pamiętaj, że konstruktor enkapsuluje całą logikę tworzenia: wywołujący po prostu przekazuje wartości początkowe i otrzymuje w pełni zainicjalizowany obiekt, gotowy do użycia.
Spróbuj swoich sił
#include <stdio.h>
#include <stdlib.h>
#include "book.h"
int main() {
char title[256];
int pages;
// Odczytaj dane wejściowe
fgets(title, sizeof(title), stdin);
// Usuń znak nowej linii, jeśli występuje
for (int i = 0; title[i]; i++) {
if (title[i] == '\n') {
title[i] = '\0';
break;
}
}
scanf("%d", &pages);
// TODO: Użyj create_book, aby utworzyć nową książkę z podanymi wartościami
// TODO: Wyświetl informacje o książce w wymaganym formacie:
// Tytuł: {title}
// Strony: {pages}
// TODO: Nie zapomnij zwolnić przydzielonej pamięci po zakończeniu
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