Rückblick - Generische Container
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy — Lektion 69 von 104.
Aufgabe
EinfachLassen Sie uns eine GenericContainer-Klassenvorlage erstellen, die alles zusammenführt, was Sie in diesem Kapitel über Templates gelernt haben. Sie werden einen flexiblen, typsicheren Container erstellen, der Elemente dynamisch speichern kann und nützliche Operationen durch Template-Techniken bereitstellt.
Sie werden Ihren Code auf zwei Dateien verteilen:
GenericContainer.h: Definieren Sie hier Ihre Klassenvorlage. IhrGenericContainersollte:Elemente dynamisch unter Verwendung eines Zeigers auf ein Array speichern und dabei die aktuelle Größe und Kapazität verfolgen.
Diese Kernmethoden bereitstellen:
- Einen Konstruktor, der eine Anfangskapazität entgegennimmt
- Einen Destruktor, der den dynamischen Speicher ordnungsgemäß bereinigt
push(T value)— fügt dem Container ein Element hinzu (nehmen Sie für diese Herausforderung an, dass die Kapazität immer ausreicht)get(size_t index)— gibt das Element an dem angegebenen Index zurückgetSize()— gibt die aktuelle Anzahl der Elemente zurück
Fügen Sie eine Funktionsvorlage namens
printContainerhinzu, die einGenericContainer<T>&entgegennimmt und alle Elemente durch Leerzeichen getrennt ausgibt, gefolgt von einem Zeilenumbruch.Erstellen Sie eine Template-Spezialisierung von
printContainerfürGenericContainer<bool>, dietrueoderfalseanstelle von1oder0ausgibt.Fügen Sie eine variadische Funktionsvorlage namens
pushAllhinzu, die einGenericContainer<T>&und eine beliebige Anzahl von Werten entgegennimmt und jeden einzelnen mithilfe eines Fold-Ausdrucks in den Container schiebt.main.cpp: Lesen Sie fünf Eingaben ein (jede in einer separaten Zeile):- Erste Ganzzahl
- Zweite Ganzzahl
- Dritte Ganzzahl
- Ein Double-Wert
- Ein Boolean als String (
trueoderfalse)
Demonstrieren Sie Ihren Container durch:
- Erstellen eines
GenericContainer<int>mit der Kapazität 10 - Verwenden von
pushAll, um alle drei Ganzzahlen auf einmal hinzuzufügen - Ausgeben der Größe:
Int container size: <size> - Aufrufen von
printContainer, um die Ganzzahlen anzuzeigen - Erstellen eines
GenericContainer<double>mit der Kapazität 5 - Hinzufügen des Double-Werts und des Literals
2.5durch einzelnepush-Aufrufe - Aufrufen von
printContainer, um die Doubles anzuzeigen - Erstellen eines
GenericContainer<bool>mit der Kapazität 5 - Hinzufügen der Boolean-Eingabe und des Literals
false - Aufrufen von
printContainer, um die Booleans anzuzeigen (solltetrue/falsezeigen)
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 kombiniert Klassenvorlagen für den Container, Template-Spezialisierung für die benutzerdefinierte bool-Ausgabe und variadische Templates für die flexible pushAll-Funktion. Ihr Container verwaltet seinen eigenen Speicher nach RAII-Prinzipien und demonstriert, wie Templates mit ordnungsgemäßem Ressourcenmanagement integriert werden.
Probier es selbst
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Eingaben lesen
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// String in bool konvertieren
bool boolVal = (boolStr == "true");
// TODO: Erstelle GenericContainer<int> mit einer Kapazität von 10
// TODO: Verwende pushAll, um alle drei Ganzzahlen auf einmal hinzuzufügen
// TODO: Gib die Größe aus: "Int container size: <size>"
// TODO: Rufe printContainer auf, um die Ganzzahlen anzuzeigen
// TODO: Erstelle GenericContainer<double> mit einer Kapazität von 5
// TODO: Füge den double-Wert und 2.5 mit einzelnen push-Aufrufen hinzu
// TODO: Rufe printContainer auf, um die Doubles anzuzeigen
// TODO: Erstelle GenericContainer<bool> mit einer Kapazität von 5
// TODO: Füge die boolesche Eingabe und false hinzu
// TODO: Rufe printContainer auf, um die Booleans anzuzeigen
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