Podsumowanie: klasa opakowująca ciąg znaków
Część sekcji Programowanie obiektowe ścieżki C w Coddy. Lekcja 16 z 61.
Wyzwanie
ŁatwyZbudujmy moduł StringObject, który opakowuje dynamicznie alokowaną tablicę znaków. To podsumowujące wyzwanie łączy cały cykl życia obiektu: konstruktor, metodę tylko do odczytu i destruktor, które współpracują ze sobą, aby bezpiecznie zarządzać pamięcią.
Utworzysz trzy pliki:
stringobj.h: Zadeklaruj strukturęStringObjectz jednym polem:char *text(wskaźnikiem do dynamicznie alokowanego ciągu znaków). Zadeklaruj też trzy funkcje:create_string: przyjmuje argumentconst char *i zwraca wskaźnik do nowo zaalokowanego obiektu StringObjectprint_string: przyjmuje argumentconst StringObject *i wyświetla przechowywany tekstfree_string: przyjmuje argumentStringObject *i zwalnia całą zaalokowaną pamięć
STRINGOBJ_H.stringobj.c: Zaimplementuj wszystkie trzy funkcje. Konstruktor powinien zaalokować pamięć dla struktury, a następnie zaalokować pamięć dla tekstu (pamiętaj ostrlenplus jednym miejscu na terminator null) i skopiować ciąg wejściowy. Destruktor musi zwalniać pamięć w odwrotnej kolejności: najpierw wewnętrzny bufortext, a następnie samą strukturę. Dla bezpieczeństwa uwzględnij sprawdzenie NULL w destruktorze.main.c: Użyj swojego modułu, aby utworzyć obiekt ciągu znaków, wyświetlić jego zawartość, a następnie prawidłowo zwolnić pamięć.
Otrzymasz jedno wejście: ciąg tekstowy do przechowania w obiekcie StringObject.
W pliku głównym utwórz obiekt StringObject z podanym tekstem, wyświetl jego zawartość, zwolnij pamięć, a następnie wyświetl komunikat potwierdzający.
Funkcja print_string powinna wyświetlać tekst w tym formacie:
Text: {text}Po zwolnieniu pamięci wyświetl:
FreedNa przykład dla wejścia Hello World wynikiem byłoby:
Text: Hello World
FreedSpróbuj swoich sił
#include <stdio.h>
#include "stringobj.h"
int main() {
char input[256];
fgets(input, sizeof(input), stdin);
// Usuń znak nowej linii, jeśli występuje
int len = 0;
while (input[len] != '\0') len++;
if (len > 0 && input[len - 1] == '\n') {
input[len - 1] = '\0';
}
// TODO: Utwórz StringObject z tekstu wejściowego
// TODO: Wypisz ciąg znaków za pomocą print_string
// TODO: Zwolnij StringObject za pomocą free_string
// TODO: Wypisz "Freed", aby potwierdzić zwolnienie zasobów
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