Podsumowanie — menedżer tablicy dynamicznej
Część sekcji Programowanie obiektowe ścieżki C++ w Coddy. Lekcja 17 z 104.
Wyzwanie
ŁatwyZbudujmy klasę DynamicArray, która zarządza własną pamięcią i automatycznie zwiększa swój rozmiar w razie potrzeby, tak jak działa pod spodem std::vector!
Utworzysz dwa pliki, aby uporządkować swój kod:
DynamicArray.h: Zdefiniuj klasęDynamicArray, która zarządza dynamicznie zmieniającą rozmiar tablicą liczb całkowitych. Twoja klasa powinna mieć:- Prywatne składowe: wskaźnik do tablicy danych, bieżący rozmiar (liczba elementów) oraz pojemność (przydzielona przestrzeń)
- Konstruktor, który przyjmuje początkową pojemność, przydziela tablicę na stercie i inicjalizuje rozmiar wartością 0
- Destruktor, który zwalnia przydzieloną pamięć i wypisuje
"DynamicArray destroyed" - Metodę
push(int value), która dodaje element do tablicy. Jeśli tablica jest pełna, powinna podwoić pojemność, przydzielając nową, większą tablicę, kopiując istniejące elementy i zwalniając starą tablicę - Metodę
get(size_t index), która zwraca element o podanym indeksie - Metodę
getSize(), która zwraca bieżącą liczbę elementów - Metodę
getCapacity(), która zwraca bieżącą pojemność
main.cpp: Wczytaj początkową pojemność i liczbę wartości do dodania. Następnie wczytaj tę liczbę wartości całkowitych i dodaj każdą z nich do swojej klasy DynamicArray. Po dodaniu wszystkich wartości wypisz:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(wszystkie elementy oddzielone spacjami)
Format danych wejściowych:
- Pierwszy wiersz: początkowa pojemność (liczba całkowita)
- Drugi wiersz: liczba wartości do dodania (liczba całkowita)
- Kolejne wiersze: po jednej wartości całkowitej w każdym wierszu
Podczas zmiany rozmiaru tablica powinna podwajać swoją pojemność. Na przykład, jeśli zaczniesz od pojemności 2 i dodasz trzeci element, pojemność powinna wzrosnąć do 4. To pokazuje zasadę RAII. Twoja klasa pozyskuje pamięć w konstruktorze i zwalnia ją w destruktorze, zapewniając brak wycieków pamięci.
Dołącz plik nagłówkowy w main.cpp za pomocą #include "DynamicArray.h".
Spróbuj swoich sił
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Wczytaj początkową pojemność
int initialCapacity;
cin >> initialCapacity;
// Wczytaj liczbę wartości do dodania
int numValues;
cin >> numValues;
// TODO: Utwórz DynamicArray o początkowej pojemności
// TODO: Wczytaj numValues liczb całkowitych i dodaj każdą z nich do tablicy
// TODO: Wypisz "Size: <size>"
// TODO: Wypisz "Capacity: <capacity>"
// TODO: Wypisz "Elements: <e1> <e2> ..." (wszystkie elementy oddzielone spacjami)
return 0;
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy programowania obiektowego
Pliki zewnętrzneBudowanie i kompilacja C++Pliki nagłówkowe i pliki źródłowePrzestrzenie nazw i zakresWprowadzenie do programowania obiektowego w C++Klasy a obiektyWskaźnik „this”Metody (funkcje składowe)Atrybuty (składowe danych)Podstawy konstruktorów i destruktorówPowtórzenie – prosty kalkulator4Właściwości klas
Elementy instancji a elementy statyczneGettery i setteryStałe funkcje składoweSłowo kluczowe mutableMetody i zmienne statyczneFunkcje i klasy zaprzyjaźnionePodsumowanie – menedżer konta bankowego7Dziedziczenie
Podstawy dziedziczeniaPoziomy dostępu w dziedziczeniuKolejność wywołań konstruktora i destruktoraNadpisywanie metodFunkcje wirtualne i VTableWielokrotne dziedziczenieDziedziczenie wirtualnePowtórzenie — hierarchia pracowników2Zarządzanie pamięcią
Pamięć stosu a stertyWskaźniki i referencjePamięć dynamiczna (new/delete)Inteligentne wskaźniki w C++RAII w C++Podsumowanie — menedżer tablicy dynamicznej5Hermetyzacja
Specyfikatory dostępu w C++Specyfikatory dostępu — szczegółowoUkrywanie informacjiStruktura a klasaKlasy zagnieżdżone i wewnętrznePodsumowanie — system ewidencji studentów8Polimorfizm
Polimorfizm czasu kompilacji i wykonaniaPrzeciążanie funkcjiFunkcje wirtualne — powtórkaCzysto wirtualne funkcjeKlasy abstrakcyjneProjektowanie interfejsów w C++Rzutowanie dynamiczne i RTTIPodsumowanie — kalkulator kształtów3Konstruktory i destruktory
Konstruktor domyślnyKonstruktor z parametramiKonstruktor kopiującyKonstruktor przenoszącyListy inicjalizacyjne konstruktoraKonstruktory delegująceDestruktor — szczegółowe omówienieZasada trzech / pięciu / zeraPodsumowanie — klasa String6Przeciążanie operatorów
Wprowadzenie do przeciążania operatorówPrzeciążanie operatorów arytmetycznychPrzeciążanie operatorów porównaniaOperatory strumieniowePrzeciążanie operatora przypisaniaPrzeciążanie operatorów [] i ()Operatory konwersji typówPodsumowanie — klasa Matrix9Szablony
Szablony funkcjiSzablony klasSpecjalizacja szablonówSzablony wariadycznePodstawy SFINAE i cech typówPodsumowanie — kontener generycznyPoćwicz samodzielnie: Kompilator C++ online