Riepilogo - Contenitore generico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 69 di 104.
Sfida
FacileCostruiamo un modello di classe GenericContainer che riunisce tutto ciò che hai imparato sui modelli in questo capitolo. Creerai un contenitore flessibile e sicuro rispetto ai tipi, in grado di memorizzare elementi dinamicamente e fornire operazioni utili tramite tecniche basate sui modelli.
Organizzerai il codice in due file:
GenericContainer.h: definisci qui il modello della classe. Il tuoGenericContainerdovrebbe:Memorizzare gli elementi dinamicamente usando un puntatore a un array, tenendo traccia anche della dimensione corrente e della capacità.
Fornire questi metodi essenziali:
- Un costruttore che accetta una capacità iniziale
- Un distruttore che libera correttamente la memoria dinamica
push(T value): aggiunge un elemento al contenitore (presumi che la capacità sia sempre sufficiente per questa sfida)get(size_t index): restituisce l'elemento all'indice specificatogetSize(): restituisce il numero attuale di elementi
Aggiungi un modello di funzione chiamato
printContainerche accetta unGenericContainer<T>&e stampa tutti gli elementi separati da spazi, seguiti da una nuova riga.Crea una specializzazione del modello di
printContainerperGenericContainer<bool>che stampatrueofalseinvece di1o0.Aggiungi un modello di funzione variadica chiamato
pushAllche accetta unGenericContainer<T>&e un qualsiasi numero di valori, inserendoli uno per uno nel contenitore usando un'espressione fold.main.cpp: leggi cinque valori (ciascuno su una riga separata):- Primo intero
- Secondo intero
- Terzo intero
- Un valore double
- Un booleano come stringa (
trueofalse)
Mostra il funzionamento del contenitore:
- Crea un
GenericContainer<int>con capacità 10 - Usa
pushAllper aggiungere tutti e tre gli interi in una volta sola - Stampa la dimensione:
Int container size: <size> - Chiama
printContainerper visualizzare gli interi - Crea un
GenericContainer<double>con capacità 5 - Aggiungi il valore double e il valore letterale
2.5usando chiamate individuali apush - Chiama
printContainerper visualizzare i valori double - Crea un
GenericContainer<bool>con capacità 5 - Aggiungi il valore booleano in input e il valore letterale
false - Chiama
printContainerper visualizzare i valori booleani (dovrebbe mostraretrue/false)
Ad esempio, con gli input 10, 20, 30, 3.14 e true:
Int container size: 3
10 20 30
3.14 2.5
true false Questa sfida combina i modelli di classe per il contenitore, la specializzazione dei modelli per la stampa personalizzata dei booleani e i modelli variadici per la funzione flessibile pushAll. Il contenitore gestisce la propria memoria seguendo i principi RAII, mostrando come i modelli si integrino con una corretta gestione delle risorse.
Provalo tu
#include <iostream>
#include <string>
#include "GenericContainer.h"
using namespace std;
int main() {
// Leggi gli input
int num1, num2, num3;
double doubleVal;
string boolStr;
cin >> num1;
cin >> num2;
cin >> num3;
cin >> doubleVal;
cin >> boolStr;
// Converti la stringa in bool
bool boolVal = (boolStr == "true");
// TODO: Crea un GenericContainer<int> con capacità 10
// TODO: Usa pushAll per aggiungere tutti e tre gli interi in una sola volta
// TODO: Stampa la dimensione: "Int container size: <size>"
// TODO: Chiama printContainer per visualizzare gli interi
// TODO: Crea un GenericContainer<double> con capacità 5
// TODO: Inserisci il valore double e 2.5 usando chiamate separate a push
// TODO: Chiama printContainer per visualizzare i valori double
// TODO: Crea un GenericContainer<bool> con capacità 5
// TODO: Inserisci l'input booleano e false
// TODO: Chiama printContainer per visualizzare i valori booleani
return 0;
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione orientata agli oggetti
File esterniBuild e compilazione in C++File header e file sorgenteNamespace e ambitoIntroduzione alla programmazione orientata agli oggetti in C++Classi e oggetti a confrontoIl puntatore 'this'Metodi (funzioni membro)Attributi (membri dati)Fondamenti di costruttori e distruttoriRiepilogo - Calcolatrice semplice4Proprietà delle classi
Membri di istanza e staticiGetter e setterFunzioni membro constParola chiave mutableMetodi e variabili staticiFunzioni e classi friendRiepilogo - Gestore di conti bancari7Ereditarietà
Ereditarietà di baseLivelli di accesso nell’ereditarietàOrdine di chiamata di costruttori e distruttoriRidefinizione dei metodiFunzioni virtuali e VTableEreditarietà multiplaEreditarietà virtualeRiepilogo - Gerarchia dei dipendenti2Gestione della memoria
Memoria Stack vs HeapPuntatori e riferimentiMemoria dinamica (new/delete)Puntatori intelligenti in C++RAII in C++Riepilogo - Gestore di array dinamico5Incapsulamento
Specificatori di accesso in C++Specificatori di accesso in dettaglioOccultamento delle informazioniStruct vs classClassi annidate e interneRiepilogo - Sistema di registrazione degli studenti8Polimorfismo
Polimorfismo a compile time e a runtimeOverload delle funzioniFunzioni virtuali: ripassoFunzioni virtuali pureClassi astratteProgettazione delle interfacce in C++Dynamic casting e RTTIRipasso: calcolatrice di forme11Concetti avanzati di OOP
Composizione vs ereditarietàMixin tramite CRTPIdiom PimplType ErasureEnum class e tipizzazione forteGestione delle eccezioni in OOPGerarchie personalizzate di eccezioni14Pattern di progettazione - Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositeRAII come pattern3Costruttori e distruttori
Costruttore predefinitoCostruttore con parametriCostruttore di copiaCostruttore di spostamentoListe di inizializzazione dei costruttoriCostruttori delegantiApprofondimento sui distruttoriRegola del Tre / Cinque / ZeroRipasso - classe String6Sovraccarico degli operatori
Introduzione al sovraccarico degli operatoriSovraccarico degli operatori aritmeticiSovraccarico degli operatori di confrontoOperatori di flussoSovraccarico dell'operatore di assegnazioneSovraccarico degli operatori [] e ()Operatori di conversione di tipoRipasso - Classe Matrix9Template
Template di funzioneTemplate di classeSpecializzazione dei templateTemplate variadiciBasi di SFINAE e dei trait di tipoRiepilogo - Contenitore genericoEsercitati da solo: Compilatore C++ online