Powtórka: tajemnicze pudełko
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 21 z 61.
Wyzwanie
ŁatwyZbudujmy moduł Box, który demonstruje pełną enkapsulację. Twój box będzie miał trzy ukryte wymiary: width, height i depth, do których można uzyskać dostęp wyłącznie za pomocą udostępnionych przez Ciebie funkcji. Oto wzorzec nieprzezroczystego wskaźnika w praktyce!
Utworzysz trzy pliki:
box.h: Twój publiczny interfejs. Zadeklaruj nieprzezroczysty typBox, używając wyłącznie deklaracji wstępnej: treść struktury pozostaje ukryta. Zadeklaruj następujące funkcje:create_box: przyjmuje trzy liczby całkowite (width, height, depth) i zwraca wskaźnik do Boxdestroy_box: zwalnia zaalokowaną pamięćget_volume: przyjmujeconst Box *i zwraca objętość (width × height × depth)set_dimensions: przyjmuje wskaźnik do Box i trzy nowe wartości wymiarów, zwracaint(1 w przypadku powodzenia, 0, jeśli którykolwiek wymiar jest ujemny lub równy zero)
BOX_H.box.c: Zdefiniuj właściwąstruct Boxz trzema ukrytymi składowymi:int width,int heightiint depth. Zaimplementuj wszystkie cztery funkcje. Konstruktor powinien alokować pamięć na box i go inicjalizować. Funkcjaset_dimensionsmusi sprawdzić, czy wszystkie trzy wartości są dodatnie (większe od zera), zanim wprowadzi zmiany; jeśli którakolwiek wartość nie przejdzie walidacji, odrzuć całą aktualizację i zwróć 0.main.c: Zademonstruj działanie enkapsulowanego Box, tworząc go, sprawdzając jego objętość, próbując zmienić wymiary (zarówno poprawnie, jak i niepoprawnie) oraz prawidłowo zwalniając zasoby.
Otrzymasz pięć danych wejściowych: początkową szerokość, początkową wysokość, początkową głębokość, a następnie trzy nowe wymiary, których ustawienia należy spróbować (mogą zawierać nieprawidłowe wartości).
W pliku main utwórz Box z początkowymi wymiarami i wypisz jego objętość. Następnie spróbuj ustawić nowe wymiary: wypisz, czy aktualizacja się powiodła, oraz wynikową objętość. Na koniec zwolnij box i potwierdź posprzątanie.
Wypisz wynik w następującym formacie:
Volume: {volume}
Set: {0 or 1}
Volume: {volume}
DestroyedNa przykład dla danych wejściowych 2, 3, 4, 5, 5, 5 wynik będzie następujący:
Volume: 24
Set: 1
Volume: 125
DestroyedDla danych wejściowych 2, 3, 4, -1, 5, 5 wynik będzie następujący:
Volume: 24
Set: 0
Volume: 24
DestroyedZwróć uwagę, jak walidacja w set_dimensions chroni Twój box przed nieprawidłowymi stanami: kod zewnętrzny nie może ominąć Twoich reguł, ponieważ wymiary są całkowicie ukryte za interfejsem.
Spróbuj swoich sił
#include <stdio.h>
#include "box.h"
int main() {
// Wczytaj początkowe wymiary
int width, height, depth;
scanf("%d", &width);
scanf("%d", &height);
scanf("%d", &depth);
// Wczytaj nowe wymiary, które zostaną wypróbowane
int new_w, new_h, new_d;
scanf("%d", &new_w);
scanf("%d", &new_h);
scanf("%d", &new_d);
// TODO: Utwórz obiekt Box o początkowych wymiarach
// TODO: Wypisz początkową objętość w formacie: "Volume: {volume}"
// TODO: Spróbuj ustawić nowe wymiary i zapisz wynik
// TODO: Wypisz, czy ustawienie się powiodło, w formacie: "Set: {0 or 1}"
// TODO: Wypisz wynikową objętość w formacie: "Volume: {volume}"
// TODO: Zniszcz obiekt Box i wypisz "Destroyed"
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