Struktury jako obiekty
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 6 z 61.
W językach obiektowych obiekt to jednostka, która łączy dane (stan) z funkcjami działającymi na tych danych (metodami). C nie ma wbudowanych obiektów, ale możemy osiągnąć ten sam efekt za pomocą struktur i funkcji.
Pomyśl o strukturze jako o części obiektu zawierającej „dane”. Przechowuje ona stan: wartości, które określają, czym obiekt jest w danej chwili:
typedef struct {
int value;
} Counter;
Ta struktura Counter reprezentuje obiekt z jednym elementem stanu: jego bieżącą wartością. Aby nadać mu zachowanie, piszemy funkcje, które przyjmują tę strukturę jako parametr:
void counter_increment(Counter *c) {
c->value++;
}
int counter_get(Counter *c) {
return c->value;
}
Te funkcje działają jak metody. Operują konkretnie na danych typu Counter. Przekazując strukturę do funkcji, symulujemy to, co inne języki robią automatycznie, gdy wywołujesz counter.increment().
int main() {
Counter my_counter = {0};
counter_increment(&my_counter);
printf("%d\n", counter_get(&my_counter)); // Wypisuje: 1
return 0;
}
Konwencja nazewnictwa typename_action (na przykład counter_increment) pomaga uporządkować kod i jasno wskazuje, do której struktury należy funkcja. Ten wzorzec stanowi podstawę programowania obiektowego w C.
Wyzwanie
ŁatwyZbudujmy prosty moduł Counter, który traktuje strukturę jak obiekt z zachowaniem. Rozmieścisz swój kod w trzech plikach, aby przećwiczyć wzorzec łączenia danych z funkcjami, które na nich operują.
Utworzysz trzy pliki:
counter.h: Plik nagłówkowy deklarujący strukturęCounterz jednym polemint value. Zadeklaruj też dwie funkcje, które pełnią rolę „metod” licznika:counter_increment(przyjmuje wskaźnik do Counter i zwiększa jego wartość o 1) orazcounter_get(przyjmuje wskaźnik do Counter i zwraca jego bieżącą wartość). Użyj strażników dołączania z symbolemCOUNTER_H.counter.c: Plik źródłowy implementujący obie funkcje. Pamiętaj, aby dołączyć plik nagłówkowy.main.c: Główny plik, który tworzy obiekt Counter, wykonuje na nim operacje i wyświetla wyniki.
Otrzymasz dwie liczby całkowite: wartość początkową licznika oraz liczbę razy, o jaką należy go zwiększyć.
W pliku głównym zainicjuj obiekt Counter wartością początkową, a następnie wywołaj counter_increment podaną liczbę razy. Na koniec użyj counter_get, aby pobrać i wyświetlić wartość końcową.
Wyświetl wynik w tym formacie:
Final value: {result}Na przykład, dla wartości początkowej 5 i 3 zwiększeń wynik będzie następujący:
Final value: 8Spróbuj swoich sił
#include <stdio.h>
#include "counter.h"
int main() {
// Wczytaj dane wejściowe
int starting_value;
int num_increments;
scanf("%d", &starting_value);
scanf("%d", &num_increments);
// TODO: Utwórz Counter i zainicjalizuj go wartością starting_value
// TODO: Wywołaj counter_increment określoną liczbę razy
// TODO: Użyj counter_get, aby pobrać wartość końcową i ją wypisać
// Format wypisywania: "Final value: {result}"
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