Implementacja koła
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 45 z 61.
Wyzwanie
ŁatwyKontynuujmy budowanie projektu Shape Drawer, implementując Circle: konkretny kształt, który osadza bazową strukturę Shape i zapewnia własną logikę rysowania oraz obliczania pola.
Rozwijając podstawy z poprzedniej lekcji, rozszerzysz swój projekt o następujące pliki:
shape.h: Zachowaj bazowy interfejsShapez poprzedniej lekcji, wraz z typami wskaźników do funkcjiDrawFunciAreaFunc.circle.h: Zdefiniuj tutaj strukturęCircle. Okrąg osadzaShapejako swój pierwszy element (co umożliwia rzutowanie w górę zgodnie z regułą pierwszego elementu) i dodaje poleradiustypudouble. Zadeklaruj funkcję konstruktoracreate_circle, która przyjmuje promień i zwraca wartość typuCircle.circle.c: Zaimplementuj tutaj zachowanie specyficzne dla okręgu:draw_circle: wypisujeDrawing Circle with radius: X.XX(promień wyświetlany z dokładnością do 2 miejsc po przecinku)area_circle: zwraca π × promień² (użyj3.14159jako wartości π)create_circle: inicjalizujeCircle, przypisuje wskaźniki do funkcji osadzonej strukturyShape, aby wskazywały nadraw_circleiarea_circle, ustawia promień i zwraca okrąg
main.c: Połącz wszystkie elementy. Wczytaj wartość promienia, utwórz okrąg za pomocą konstruktora, a następnie wywołaj zarównodraw, jak iareaza pośrednictwem wskaźników do funkcji osadzonej strukturyShape. Wypisz pole z dokładnością do 2 miejsc po przecinku.
Twój program otrzyma jedno dane wejściowe: wartość promienia (jako liczbę zmiennoprzecinkową).
Przykładowe wyjście dla danych wejściowych 5.0:
Drawing Circle with radius: 5.00
Area: 78.54Przykładowe wyjście dla danych wejściowych 3.5:
Drawing Circle with radius: 3.50
Area: 38.48Kluczowa kwestia jest taka, że Circle zawiera Shape jako swój pierwszy element, więc możesz uzyskać dostęp do wskaźników do funkcji przez circle.base.draw i circle.base.area (lub przez element osadzony, któremu nadasz inną nazwę). Wywołując te funkcje, przekaż wskaźnik do elementu Shape. Pamiętaj, aby używać strażników dołączania we wszystkich plikach nagłówkowych.
Spróbuj swoich sił
#include <stdio.h>
#include "shape.h"
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Utwórz Circle za pomocą create_circle
// TODO: Wywołaj draw przez wskaźnik do funkcji w osadzonym Shape
// TODO: Wywołaj area przez wskaźnik do funkcji w osadzonym Shape
// i wypisz z 2 miejscami po przecinku: "Area: %.2f\n"
return 0;
}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