Menu
Coddy logo textTech

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.

challenge icon

Wyzwanie

Łatwy

Zbudujmy 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ę Book z dwoma polami: char *title (wskaźnik do dynamicznie alokowanego ciągu znaków) oraz int pages. Zadeklaruj także funkcję konstruktora create_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 symbolem BOOK_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: 272

Pamię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;
}
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