Rückblick – Generischer Container
Teil des Abschnitts Objektorientierte Programmierung der C++-Journey von Coddy. Lektion 69 von 104.
Aufgabe
EinfachLass uns eine GenericContainer-Vorlage für die class erstellen, die alles zusammenführt, was du in diesem Kapitel über Vorlagen gelernt hast. Du wirst einen flexiblen, typsicheren Container erstellen, der elements dynamisch speichern und durch Vorlagentechniken nützliche Operationen bereitstellen kann.
Du organisierst deinen Code über zwei Dateien:
GenericContainer.h: Definiere hier deineclass-Vorlage. DeinGenericContainersollte:elementsdynamisch mithilfe eines Zeigers auf einarrayspeichern und dabei diecurrentGröße sowie diecapacityverfolgen.Diese grundlegenden Methoden bereitstellen:
- Einen Konstruktor, der eine
initialcapacityentgegennimmt - Einen Destruktor, der den dynamischen Speicher ordnungsgemäß bereinigt
push(T value): einelementzum Container hinzufügen (für diese Aufgabe wird angenommen, dass diecapacityimmer ausreicht)get(size_t index): daselementam angegebenenindexzurückgebengetSize(): die aktuelle Anzahl derelementszurückgeben
Eine
function-Vorlage namensprintContainerhinzufügen, die einenGenericContainer<T>&entgegennimmt und alleelements, durch Leerzeichen getrennt und gefolgt von einem Zeilenumbruch, ausgibt.Eine Vorlagenspezialisierung von
printContainerfürGenericContainer<bool>erstellen, dietrueoderfalseanstelle von1oder0ausgibt.Eine variadische
function-Vorlage namenspushAllhinzufügen, die einenGenericContainer<T>&und eine beliebige Anzahl von Werten entgegennimmt und jeden einzelnen mithilfe einesfold-Ausdrucks in den Container einfügt.- Einen Konstruktor, der eine
main.cpp: Lies fünf Eingaben ein (jede in einer eigenen Zeile):- Erste ganze Zahl
- Zweite ganze Zahl
- Dritte ganze Zahl
- Einen
double-Wert - Einen
boolean-Wert als Zeichenkette (trueoderfalse)
Demonstriere deinen Container, indem du:
- Einen
GenericContainer<int>mit dercapacity10 erstellst pushAllverwendest, um alle drei ganzen Zahlen gleichzeitig hinzuzufügen- Die Größe ausgibst:
Int container size: <size> printContaineraufrufst, um die ganzen Zahlen anzuzeigen- Einen
GenericContainer<double>mit dercapacity5 erstellst - Den
double-Wert und das Literal2.5mithilfe einzelnerpush-Aufrufe einfügst printContaineraufrufst, um diedoublesanzuzeigen- Einen
GenericContainer<bool>mit dercapacity5 erstellst - Die
boolean-Eingabe und das Literalfalseeinfügst printContaineraufrufst, um diebooleansanzuzeigen (es solltetrue/falseausgeben)
Beispielsweise mit den Eingaben 10, 20, 30, 3.14 und true:
Int container size: 3
10 20 30
3.14 2.5
true false Diese Aufgabe kombiniert class-Vorlagen für den Container, Vorlagenspezialisierung für die benutzerdefinierte bool-Ausgabe und variadische Vorlagen für die flexible pushAll-function. Dein Container verwaltet seinen eigenen Speicher nach den RAII-Prinzipien und zeigt, wie Vorlagen mit einer ordnungsgemäßen Ressourcenverwaltung zusammenwirken.
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 Kapazität 10
// TODO: Verwende pushAll, um alle drei Ganzzahlen auf einmal hinzuzufügen
// TODO: Print the size: "Int container size: <size>"
// TODO: Call printContainer to display the integers
// TODO: Erstelle GenericContainer<double> mit Kapazität 5
// TODO: Füge den double-Wert und 2.5 mit einzelnen push-Aufrufen hinzu
// TODO: Call printContainer to display the doubles
// TODO: Erstelle GenericContainer<bool> mit Kapazität 5
// TODO: Füge die boolesche Eingabe und false hinzu
// TODO: Call printContainer to display the booleans
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