Récapitulatif - Conteneur générique
Fait partie de la section Programmation Orientée Objet du Journey C++ de Coddy — leçon 69 sur 104.
Défi
FacileConstruisons un modèle de classe GenericContainer qui rassemble tout ce que vous avez appris sur les templates dans ce chapitre. Vous allez créer un conteneur flexible et de type sécurisé qui peut stocker des éléments de manière dynamique et fournir des opérations utiles grâce aux techniques de templates.
Vous organiserez votre code sur deux fichiers :
GenericContainer.h: Définissez votre modèle de classe ici. VotreGenericContainerdoit :Stocker les éléments de manière dynamique à l'aide d'un pointeur vers un tableau, tout en suivant la taille actuelle et la capacité.
Fournir ces méthodes de base :
- Un constructeur qui prend une capacité initiale
- Un destructeur qui nettoie correctement la mémoire dynamique
push(T value)— ajoute un élément au conteneur (supposez que la capacité est toujours suffisante pour ce défi)get(size_t index)— retourne l'élément à l'index donnégetSize()— retourne le nombre actuel d'éléments
Ajouter un modèle de fonction appelé
printContainerqui prend unGenericContainer<T>&et affiche tous les éléments séparés par des espaces, suivis d'un saut de ligne.Créer une spécialisation de modèle de
printContainerpourGenericContainer<bool>qui affichetrueoufalseau lieu de1ou0.Ajouter un modèle de fonction variadique appelé
pushAllqui prend unGenericContainer<T>&et n'importe quel nombre de valeurs, en insérant chacune dans le conteneur à l'aide d'une expression de repli (fold expression).main.cpp: Lire cinq entrées (chacune sur une ligne séparée) :- Premier entier
- Deuxième entier
- Troisième entier
- Une valeur double
- Un booléen sous forme de chaîne (
trueoufalse)
Démontrer votre conteneur en :
- Créant un
GenericContainer<int>avec une capacité de 10 - Utilisant
pushAllpour ajouter les trois entiers en une seule fois - Affichant la taille :
Int container size: <size> - Appelant
printContainerpour afficher les entiers - Créant un
GenericContainer<double>avec une capacité de 5 - Ajoutant la valeur double et le littéral
2.5à l'aide d'appelspushindividuels - Appelant
printContainerpour afficher les doubles - Créant un
GenericContainer<bool>avec une capacité de 5 - Ajoutant l'entrée booléenne et le littéral
false - Appelant
printContainerpour afficher les booléens (devrait affichertrue/false)
Par exemple, avec les entrées 10, 20, 30, 3.14, et true :
Int container size: 3
10 20 30
3.14 2.5
true false Ce défi combine les modèles de classes pour le conteneur, la spécialisation de modèle pour l'affichage personnalisé des booléens, et les modèles variadiques pour la fonction flexible pushAll. Votre conteneur gère sa propre mémoire en suivant les principes RAII, démontrant comment les modèles s'intègrent à une gestion appropriée des ressources.
Essayez vous-même
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Lire les entrées
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Convertir la chaîne en bool
bool boolVal = (boolStr == "true");
// TODO: Créer GenericContainer<int> avec une capacité de 10
// TODO: Utiliser pushAll pour ajouter les trois entiers en même temps
// TODO: Afficher la taille : "Int container size: <size>"
// TODO: Appeler printContainer pour afficher les entiers
// TODO: Créer GenericContainer<double> avec une capacité de 5
// TODO: Ajouter la valeur double et 2.5 en utilisant des appels push individuels
// TODO: Appeler printContainer pour afficher les doubles
// TODO: Créer GenericContainer<bool> avec une capacité de 5
// TODO: Ajouter l'entrée booléenne et false
// TODO: Appeler printContainer pour afficher les booléens
return 0;
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesBuild et Compilation C++Fichiers d'en-tête et Fichiers sourceEspaces de noms et PortéeIntroduction à la POO en C++Classes vs ObjetsLe pointeur 'this'Méthodes (Fonctions membres)Attributs (Membres de données)Bases des Ctors et DtorsRécapitulatif - Calculatrice simple4Propriétés de classe
Membres d'instance vs membres statiquesGetters et SettersFonctions membres constMot-clé mutableMéthodes et variables statiquesFonctions et classes amiesRécapitulatif - Gestionnaire de compte bancaire7Héritage
Héritage de baseNiveaux d'accès à l'héritageOrdre d'appel des Ctor et DtorRedéfinition de méthodesFonctions virtuelles et VTableHéritage multipleHéritage virtuelRécapitulatif - Hiérarchie des employés10Présentation de la STL
Présentation et philosophie de la STLConteneurs de la STLItérateursAlgorithmes de la STLFoncteurs et expressions lambdaRécapitulatif - Fréquence des mots13Patrons de conception, Partie 1
Introduction aux patrons de conceptionPatron SingletonFabrique & Fabrique abstraitePatron MonteurPatron ObservateurPatron Stratégie2Gestion de la mémoire
Mémoire Pile vs TasPointeurs et RéférencesMémoire dynamique (new/delete)Smart Pointers en C++RAII en C++Récapitulatif - Gestionnaire de tableaux dynamiques5Encapsulation
Spécificateurs d'accès en C++Spécificateurs d'accès en profondeurMasquage d'informationStruct vs ClassClasses imbriquées et internesRécapitulatif - Système de gestion d'étudiants8Polymorphisme
Polymorphisme : Compilation vs ExécutionSurcharge de fonctionsRetour sur les fonctions virtuellesFonctions virtuelles puresClasses abstraitesConception d'interfaces en C++Dynamic Casting & RTTIRécapitulatif - Calculateur de formes11Concepts avancés de la POO
Composition vs HéritageMixins via CRTPIdiome PimplEffacement de typeEnum Classes & Typage fortGestion des exceptions en POOHiérarchies d'exceptions personnalisées14Patrons de conception, Partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositeRAII en tant que patron3Constructeurs et Destructeurs
Constructeur par défautConstructeur paramétréConstructeur de copieConstructeur de déplacementListes d'initialisation du constructeurConstructeurs déléguésAnalyse approfondie du destructeurRègle de trois / cinq / zéroRécapitulatif - Classe String6Surcharge d'opérateurs
Introduction à la surcharge d'opérateursSurcharge des opérateurs arithmétiquesSurcharge des opérateurs de comparaisonOpérateurs de fluxSurcharge de l'opérateur d'affectationSurcharge des opérateurs [] et ()Opérateurs de conversion de typeRécapitulatif - Classe Matrix9Templates
Templates de fonctionsTemplates de classesSpécialisation de templatesTemplates variadiquesBases de SFINAE & Type TraitsRécapitulatif - Conteneur générique