Menu
Coddy logo textTech

Przegląd projektu

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

challenge icon

Wyzwanie

Łatwy

Stwórzmy podstawy projektu Shape Drawer, tworząc bazową strukturę Shape: interfejs, który definiuje, co może robić dowolny kształt, za pomocą wskaźników do funkcji.

Utworzysz dwa pliki, aby skonfigurować ten system polimorficzny:

  • shape.h: Zdefiniuj tutaj główny interfejs. Najpierw utwórz deklarację wstępną struktury Shape. Następnie zdefiniuj dwa typy wskaźników do funkcji:
    • DrawFunc: przyjmuje parametr const Shape* i niczego nie zwraca
    • AreaFunc: przyjmuje parametr const Shape* i zwraca wartość typu double
    Na koniec zdefiniuj samą strukturę Shape, zawierającą dwa wskaźniki do funkcji: draw (typu DrawFunc) i area (typu AreaFunc). Ta struktura pełni wyłącznie funkcję interfejsu. Nie przechowuje żadnych danych dotyczących konkretnego kształtu, a jedynie jego zachowanie.
  • main.c: Zademonstruj działanie interfejsu, tworząc prosty kształt testowy. Zaimplementuj dwie funkcje:
    • test_draw: wypisuje Drawing test shape
    • test_area: zwraca 42.0
    Utwórz instancję Shape, połącz ją z tymi funkcjami testowymi, a następnie wywołaj obie funkcje za pośrednictwem interfejsu. Wypisz wynik obliczenia pola z jednym miejscem po przecinku.

Wynik powinien pokazać, że wskaźniki do funkcji działają poprawnie:

Drawing test shape
Area: 42.0

Dlaczego deklaracja wstępna? Możesz się zastanawiać, dlaczego typedef struct Shape Shape; pojawia się przed pełną definicją struktury. Jest to konieczne, ponieważ typy DrawFunc i AreaFunc odwołują się do const Shape* w typach swoich parametrów, ale w tym miejscu pliku kompilator nie widział jeszcze pełnej definicji struktury. Deklaracja wstępna informuje kompilator: „istnieje struktura o nazwie Shape”, co wystarczy, aby użyć wskaźnika do niej. Pełna definicja pojawia się później. Ten wzorzec jest powszechny w C, gdy struktura musi odwoływać się do samej siebie (bezpośrednio lub za pośrednictwem wskaźników do funkcji).

Najważniejszy wniosek jest taki, że Shape nie wie nic o kołach ani prostokątach. Wie tylko, że każdy kształt musi umieć sam siebie draw i obliczać swoje area. W kolejnych lekcjach utworzysz konkretne kształty, które będą zawierać tę bazową strukturę i dostarczą własne implementacje. Pamiętaj, aby używać strażników dołączania w pliku nagłówkowym.

Spróbuj swoich sił

#include <stdio.h>
#include "shape.h"

// TODO: Zaimplementuj funkcję test_draw
// - Przyjmuje parametr const Shape*
// - Wypisuje "Drawing test shape"
void test_draw(const Shape* shape) {
    // TODO: Wypisz wymagany komunikat
}

// TODO: Zaimplementuj funkcję test_area
// - Przyjmuje parametr const Shape*
// - Zwraca 42.0
double test_area(const Shape* shape) {
    // TODO: Zwróć testową wartość pola
}

int main() {
    // TODO: Utwórz instancję Shape
    
    // TODO: Powiąż obiekt shape z funkcjami test_draw i test_area
    
    // TODO: Wywołaj draw przez interfejs
    
    // TODO: Wywołaj area przez interfejs i wypisz wynik z jednym miejscem po przecinku
    // Format: "Area: %.1f\n"
    
    return 0;
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator C online