Rückblick – Dynamischer Array-Manager
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 17 von 104.
Aufgabe
EinfachErstellen wir eine DynamicArray-Klasse, die ihren eigenen Speicher verwaltet und bei Bedarf automatisch wächst – genau wie std::vector im Hintergrund funktioniert!
Du erstellst zwei Dateien, um deinen Code zu organisieren:
DynamicArray.h: Definiere eineDynamicArray-Klasse, die ein dynamisch großes Array von Ganzzahlen verwaltet. Deine Klasse sollte Folgendes enthalten:- Private Member: einen Zeiger auf das Datenarray, die aktuelle Größe (Anzahl der Elemente) und die Kapazität (zugewiesener Speicherplatz)
- Einen Konstruktor, der eine anfängliche Kapazität entgegennimmt, das Array auf dem Heap reserviert und die Größe auf 0 initialisiert
- Einen Destruktor, der den reservierten 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 reserviert, 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: Lies eine anfängliche Kapazität und eine Anzahl hinzuzufügender Werte ein. Lies anschließend diese Anzahl an Ganzzahlen ein und füge jede davon in dein DynamicArray ein. Gib nach dem Hinzufügen aller Werte Folgendes aus:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(alle Elemente durch Leerzeichen getrennt)
Das Eingabeformat lautet:
- Erste Zeile: anfängliche Kapazität (Ganzzahl)
- Zweite Zeile: Anzahl der hinzuzufügenden Werte (Ganzzahl)
- Folgende Zeilen: jeweils ein Ganzzahlwert pro Zeile
Beim Ändern der Größe sollte dein Array seine Kapazität verdoppeln. Wenn du beispielsweise mit der Kapazität 2 startest und ein drittes Element hinzufügst, sollte die Kapazität 4 betragen. Dies demonstriert das RAII-Prinzip. Deine Klasse reserviert Speicher im Konstruktor und gibt ihn im Destruktor frei, wodurch Speicherlecks verhindert werden.
Binde deine Header-Datei in main.cpp mit #include "DynamicArray.h" ein.
Probier es selbst
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Initiale Kapazität einlesen
int initialCapacity;
cin >> initialCapacity;
// Anzahl der hinzuzufügenden Werte einlesen
int numValues;
cin >> numValues;
// TODO: Create a DynamicArray with the initial capacity
// TODO: numValues Ganzzahlen einlesen und jede in das Array pushen
// TODO: "Size: <size>" ausgeben
// TODO: "Capacity: <capacity>" ausgeben
// TODO: "Elements: <e1> <e2> ..." ausgeben (alle Elemente durch Leerzeichen getrennt)
return 0;
}
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der OOP
Externe DateienC++ Build & KompilierungHeader-Dateien & QuelldateienNamespaces & GültigkeitsbereichEinführung in OOP mit C++Klassen vs. ObjekteDer „this“-ZeigerMethoden (Member-Funktionen)Attribute (Datenmember)Grundlagen zu Ctors & DtorsRückblick – Einfacher Taschenrechner4Klassenattribute
Instanz- vs. statische MemberGetter und SetterConst-MemberfunktionenMutable-SchlüsselwortStatische Methoden und VariablenFriend-Funktionen und -KlassenZusammenfassung – Bankkontoverwaltung7Vererbung
Grundlagen der VererbungZugriffsebenen bei der VererbungAufrufreihenfolge von Ctor & DtorÜberschreiben von MethodenVirtuelle Funktionen & VTableMehrfachvererbungVirtuelle VererbungRückblick – Mitarbeiterhierarchie2Speicherverwaltung
Stack- vs. Heap-SpeicherZeiger und ReferenzenDynamischer Speicher (new/delete)Intelligente Zeiger in C++RAII in C++Rückblick – Dynamischer Array-Manager5Kapselung
Zugriffsbezeichner in C++Zugriffsbezeichner im DetailInformationsverbergungStruct vs. KlasseVerschachtelte und innere KlassenWiederholung – Studierendenverwaltungssystem8Polymorphie
Polymorphie zur Compilezeit vs. LaufzeitFunktionsüberladungVirtuelle Funktionen erneut betrachtetRein virtuelle FunktionenAbstrakte KlassenInterface-Design in C++Dynamic Casting & RTTIRückblick – Shape-Calculator3Konstruktoren & Destruktoren
StandardkonstruktorParametrisierter KonstruktorKopierkonstruktorMove-KonstruktorKonstruktor-InitialisierungslistenDelegierende KonstruktorenDestruktor im DetailDrei-/Fünf-/Null-RegelZusammenfassung – String-Klasse6Operatorüberladung
Einführung in die OperatorüberladungArithmetische OperatorüberladungVergleichsoperatorüberladungStream-OperatorenZuweisungsoperatorüberladungÜberladung der Operatoren [] und ()TypkonvertierungsoperatorenWiederholung – Matrix-Klasse9Templates
FunktionstemplatesKlassen-TemplatesTemplate-SpezialisierungVariadische TemplatesGrundlagen zu SFINAE und Type TraitsRückblick – Generischer ContainerÜbe selbstständig: Online-C++-Compiler