Rückblick – Dynamischer Array-Manager
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 17 von 104.
Aufgabe
EinfachLassen Sie uns eine DynamicArray-Klasse bauen, die ihren eigenen Speicher verwaltet und bei Bedarf automatisch wächst — genau so, wie std::vector unter der Haube funktioniert!
Sie werden zwei Dateien erstellen, um Ihren Code zu organisieren:
DynamicArray.h: Definieren Sie eineDynamicArray-Klasse, die ein dynamisch dimensioniertes Array von Ganzzahlen verwaltet. Ihre Klasse sollte Folgendes haben:- Private Member: einen Zeiger auf das Daten-Array, die aktuelle Größe (Anzahl der Elemente) und die Kapazität (zugewiesener Speicherplatz)
- Einen Konstruktor, der eine Anfangskapazität entgegennimmt, das Array auf dem Heap alloziert und die Größe auf 0 initialisiert
- Einen Destruktor, der den allozierten Speicher freigibt und
"DynamicArray destroyed"ausgibt - Eine
push(int value)-Methode, die ein Element zum Array hinzufügt. Wenn das Array voll ist, sollte sie die Kapazität verdoppeln, indem sie ein neues, größeres Array alloziert, die vorhandenen Elemente kopiert und das alte Array freigibt - Eine
get(size_t index)-Methode, die das Element am angegebenen Index zurückgibt - Eine
getSize()-Methode, die die aktuelle Anzahl der Elemente zurückgibt - Eine
getCapacity()-Methode, die die aktuelle Kapazität zurückgibt
main.cpp: Lesen Sie eine Anfangskapazität und eine Anzahl der hinzuzufügenden Werte ein. Lesen Sie dann so viele Ganzzahlwerte ein und pushen Sie jeden einzelnen in Ihr DynamicArray. Geben Sie nach dem Hinzufügen aller Werte Folgendes aus:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(alle Elemente durch Leerzeichen getrennt)
Das Eingabeformat ist:
- Erste Zeile: Anfangskapazität (Ganzzahl)
- Zweite Zeile: Anzahl der hinzuzufügenden Werte (Ganzzahl)
- Folgende Zeilen: ein Ganzzahlwert pro Zeile
Beim Ändern der Größe sollte Ihr Array seine Kapazität verdoppeln. Wenn Sie beispielsweise mit einer Kapazität von 2 beginnen und ein drittes Element pushen, sollte die Kapazität 4 werden. Dies demonstriert das RAII-Prinzip — Ihre Klasse belegt Speicher im Konstruktor und gibt ihn im Destruktor wieder frei, wodurch Speicherlecks vermieden werden.
Binden Sie Ihre Header-Datei in main.cpp mit #include "DynamicArray.h" ein.
Probier es selbst
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Initialkapazität einlesen
int initialCapacity;
cin >> initialCapacity;
// Anzahl der hinzuzufügenden Werte einlesen
int numValues;
cin >> numValues;
// TODO: Erstelle ein DynamicArray mit der Initialkapazität
// TODO: Lese numValues Ganzzahlen ein und füge jede dem Array hinzu
// TODO: Gebe "Size: <size>" aus
// TODO: Gebe "Capacity: <capacity>" aus
// TODO: Gebe "Elements: <e1> <e2> ..." aus (alle Elemente durch Leerzeichen getrennt)
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamensräume & GültigkeitsbereicheEinführung in OOP in C++Klassen vs. ObjekteDer 'this'-PointerMethoden (Elementfunktionen)Attribute (Datenelemente)Grundlagen zu Ctors & DtorsRückblick - Einfacher Taschenrechner4Klasseneigenschaften
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen & KlassenZusammenfassung - Bankkonto-Manager7Vererbung
Grundlagen der VererbungZugriffsstufen bei VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick - Mitarbeiter-Hierarchie2Speicherverwaltung
Stack vs. Heap SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Smart Pointers in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsspezifizierer in C++Zugriffsspezifizierer im DetailInformation HidingStruct vs. ClassVerschachtelte & innere KlassenRückblick - Studentenverwaltungssystem8Polymorphie
Kompilierzeit- vs. Laufzeit-PolymorphieFunktionsüberladungVirtuelle Funktionen – WiederholungRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIZusammenfassung – Formen-Rechner3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorVerschiebekonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktoren im DetailRule of Three / Five / ZeroZusammenfassung - String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladen der [] und () OperatorenTypumwandlungsoperatorenRückblick - Matrix-Klasse9Templates
FunktionstemplatesKlassentemplatesTemplate-SpezialisierungVariadische TemplatesSFINAE & Type Traits GrundlagenRückblick - Generische Container