Metody pomocnicze
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 10 z 61.
Do tej pory poznaliśmy funkcje, które modyfikują dane struktury (takie jak player_take_damage) oraz funkcje, które po prostu je wyświetlają. Istnieje jednak jeszcze jedna ważna kategoria: funkcje, które obliczają wartości pochodne na podstawie składowych struktury, niczego nie zmieniając.
Rozważ strukturę Rectangle, która przechowuje szerokość i wysokość. Pole powierzchni nie jest przechowywane — oblicza się je na żądanie:
typedef struct {
double width;
double height;
} Rectangle;
double rectangle_area(const Rectangle *self) {
return self->width * self->height;
}
double rectangle_perimeter(const Rectangle *self) {
return 2 * (self->width + self->height);
}
To są metody pomocnicze. Pobierają istniejące dane struktury i zwracają nową wartość. Zwróć uwagę, że używają wskaźników const, ponieważ tylko odczytują dane, a nigdy ich nie zapisują. Obliczony wynik jest zwracany, zamiast być przechowywany w strukturze.
Rectangle box = {5.0, 3.0};
printf("Area: %.1f\n", rectangle_area(&box)); // 15.0
printf("Perimeter: %.1f\n", rectangle_perimeter(&box)); // 16.0
Ten wzorzec pozwala zachować zwięzłość struktur: przechowuj tylko niezbędne dane, a wszystko inne obliczaj w razie potrzeby. Dzięki temu wartości pochodne są zawsze zgodne z bieżącym stanem.
Wyzwanie
ŁatwyZbudujmy moduł Circle, który oblicza wartości pochodne na podstawie przechowywanych danych. Poćwiczysz pisanie metod pomocniczych: funkcji, które obliczają wyniki na podstawie składowych struktury, nie modyfikując ich.
Utworzysz trzy pliki:
circle.h: Zadeklaruj strukturęCirclez jedną składowądouble radius. Zadeklaruj także dwie metody pomocnicze:circle_area: przyjmuje wskaźnikconstdo Circle i zwraca polecircle_circumference: przyjmuje wskaźnikconstdo Circle i zwraca obwód
CIRCLE_H.circle.c: Zaimplementuj obie metody pomocnicze. Do obliczeń użyj3.14159jako wartości pi. Wzór na pole topi * radius * radius, a wzór na obwód to2 * pi * radius. Obie funkcje powinny tylko odczytywać promień: nigdy go nie modyfikuj.main.c: Utwórz obiekt Circle i użyj metod pomocniczych, aby obliczyć i wyświetlić jego właściwości.
Otrzymasz jedno wejście: promień koła (jako double).
W pliku głównym zainicjalizuj Circle podanym promieniem, a następnie użyj metod pomocniczych, aby obliczyć i wyświetlić pole oraz obwód.
Wyświetl wyniki w następującym formacie:
Area: {area}
Circumference: {circumference}Użyj %.2f dla obu wartości, aby wyświetlić je z dokładnością do dwóch miejsc po przecinku.
Na przykład dla promienia 5.0 wynik byłby następujący:
Area: 78.54
Circumference: 31.42Spróbuj swoich sił
#include <stdio.h>
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: Utwórz strukturę Circle o podanym promieniu
// TODO: Użyj funkcji pomocniczych circle_area i circle_circumference
// aby obliczyć i wyświetlić wyniki
// Format wyświetlania:
// printf("Area: %.2f\n", ...);
// printf("Circumference: %.2f\n", ...);
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