Rückblick – Generischer Container
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 69 von 104.
Aufgabe
EinfachLass uns eine Klassenvorlage GenericContainer erstellen, die alles zusammenführt, was du in diesem Kapitel über Vorlagen gelernt hast. Du erstellst einen flexiblen, typsicheren Container, der Elemente dynamisch speichern und mithilfe von Vorlagentechniken nützliche Operationen bereitstellen kann.
Du verteilst deinen Code auf zwei Dateien:
GenericContainer.h: Definiere hier deine Klassenvorlage. DeinGenericContainersollte:Elemente dynamisch mithilfe eines Zeigers auf ein Array speichern und dabei die aktuelle Größe und Kapazität nachverfolgen.
Diese grundlegenden Methoden bereitstellen:
- Einen Konstruktor, der eine Anfangskapazität entgegennimmt
- Einen Destruktor, der den dynamischen Speicher ordnungsgemäß freigibt
push(T value): Fügt dem Container ein Element hinzu (für diese Herausforderung kannst du davon ausgehen, dass die Kapazität immer ausreicht)get(size_t index): Gibt das Element am angegebenen Index zurückgetSize(): Gibt die aktuelle Anzahl der Elemente zurück
Füge eine Funktionsvorlage namens
printContainerhinzu, die einGenericContainer<T>&entgegennimmt und alle Elemente durch Leerzeichen getrennt, gefolgt von einem Zeilenumbruch, ausgibt.Erstelle eine Spezialisierung der Vorlage
printContainerfürGenericContainer<bool>, dietrueoderfalsestatt1oder0ausgibt.Füge eine variadische Funktionsvorlage namens
pushAllhinzu, die einGenericContainer<T>&und eine beliebige Anzahl von Werten entgegennimmt und jeden Wert mithilfe eines Faltungsausdrucks in den Container einfügt. Eine Faltung über den Kommaoperator, etwa(container.push(args), ...);, führt den Aufruf einmal pro Argument aus.main.cpp: Lies fünf Eingaben (jeweils in einer eigenen Zeile):- Erste Ganzzahl
- Zweite Ganzzahl
- Dritte Ganzzahl
- Ein Wert vom Typ double
- Ein boolescher Wert als Zeichenfolge (
trueoderfalse)
Führe deinen Container anhand folgender Schritte vor:
- Erstelle einen
GenericContainer<int>mit der Kapazität 10 - Verwende
pushAll, um alle drei Ganzzahlen auf einmal hinzuzufügen - Gib die Größe aus:
Int container size: <size> - Rufe
printContainerauf, um die Ganzzahlen auszugeben - Erstelle einen
GenericContainer<double>mit der Kapazität 5 - Füge den Wert vom Typ double und das Literal
2.5mit einzelnen Aufrufen vonpushhinzu - Rufe
printContainerauf, um die Werte vom Typ double auszugeben - Erstelle einen
GenericContainer<bool>mit der Kapazität 5 - Füge die boolesche Eingabe und das Literal
falsehinzu - Rufe
printContainerauf, um die booleschen Werte auszugeben (solltetrue/falseanzeigen)
Zum Beispiel bei den Eingaben 10, 20, 30, 3.14 und true:
Int container size: 3
10 20 30
3.14 2.5
true false Diese Herausforderung vereint Klassenvorlagen für den Container, eine Vorlagenspezialisierung für die benutzerdefinierte Ausgabe von booleschen Werten und variadische Vorlagen für die flexible Funktion pushAll. Dein Container verwaltet seinen eigenen Speicher gemäß den RAII-Prinzipien und zeigt, wie Vorlagen mit einer ordnungsgemäßen Ressourcenverwaltung zusammenspielen.
Probier es selbst
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Eingaben einlesen
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Zeichenkette in bool umwandeln
bool boolVal = (boolStr == "true");
// TODO: GenericContainer<int> mit Kapazität 10 erstellen
// TODO: Mit pushAll alle drei Ganzzahlen auf einmal hinzufügen
// TODO: Die Größe ausgeben: "Int container size: <size>"
// TODO: printContainer aufrufen, um die Ganzzahlen anzuzeigen
// TODO: GenericContainer<double> mit Kapazität 5 erstellen
// TODO: Den double-Wert und 2.5 mit einzelnen push-Aufrufen hinzufügen
// TODO: printContainer aufrufen, um die double-Werte anzuzeigen
// TODO: GenericContainer<bool> mit Kapazität 5 erstellen
// TODO: Die bool-Eingabe und false hinzufügen
// TODO: printContainer aufrufen, um die bool-Werte anzuzeigen
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