Koncepcja niejawnych wskaźników
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 17 z 61.
Jak dotąd, gdy definiujemy strukturę w pliku nagłówkowym, każdy, kto dołączy ten plik nagłówkowy, może zobaczyć i bezpośrednio uzyskać dostęp do wszystkich jej składowych. Narusza to enkapsulację: zasadę ukrywania szczegółów wewnętrznych przed kodem zewnętrznym.
C oferuje potężną technikę zwaną nieprzezroczystymi wskaźnikami, która rozwiązuje ten problem. Pomysł jest prosty: zadeklaruj w pliku nagłówkowym, że struktura istnieje, ale nie ujawniaj, co się w niej znajduje. Robi się to za pomocą niekompletnego typu:
// wallet.h
typedef struct Wallet Wallet; // Tylko deklaracja – bez definicji!
Wallet *create_wallet(int initial_balance);
void free_wallet(Wallet *w);
Zwróć uwagę, że nie ma tu nawiasów klamrowych. Nigdy nie definiujemy, co zawiera Wallet. Kompilator wie, że ten typ istnieje, ale nie zna jego rozmiaru ani składowych. Oznacza to, że kod zawierający ten nagłówek może działać tylko ze do Wallet, a nigdy bezpośrednio z samą strukturą.
Dlaczego to ma znaczenie? Ponieważ właściwa definicja struktury jest ukryta w pliku .c, żaden kod korzystający z Twojego pliku nagłówkowego nie może użyć w->balance ani sizeof(Wallet). Musi korzystać z funkcji, które udostępniasz. Masz kontrolę nad całym dostępem do danych i możesz później zmienić wewnętrzną strukturę bez psucia kodu zależnego od Twojego pliku nagłówkowego.
W następnej lekcji poćwiczysz definiowanie właściwego ciała struktury w pliku źródłowym, kończąc wzorzec nieprzezroczystego wskaźnika.
Spróbuj swoich sił
Ta lekcja nie zawiera wyzwania z kodem.
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