Riepilogo - Gestore di array dinamico
Fa parte della sezione Programmazione orientata agli oggetti del percorso C++ di Coddy. Lezione 17 di 104.
Sfida
FacileCreiamo una classe DynamicArray che gestisce la propria memoria e cresce automaticamente quando necessario, proprio come funziona std::vector internamente!
Creerai due file per organizzare il codice:
DynamicArray.h: Definisci una classeDynamicArrayche gestisce un array di interi di dimensione dinamica. La classe dovrebbe avere:- Campi privati: un puntatore all'array dei dati, la dimensione corrente (numero di elementi) e la capacità (spazio allocato)
- Un costruttore che accetta una capacità iniziale, alloca l'array nell'heap e inizializza la dimensione a 0
- Un distruttore che libera la memoria allocata e stampa
"DynamicArray destroyed" - Un metodo
push(int value)che aggiunge un elemento all'array. Se l'array è pieno, dovrebbe raddoppiare la capacità allocando un nuovo array più grande, copiando gli elementi esistenti e liberando il vecchio array - Un metodo
get(size_t index)che restituisce l'elemento all'indice specificato - Un metodo
getSize()che restituisce il numero corrente di elementi - Un metodo
getCapacity()che restituisce la capacità corrente
main.cpp: Leggi una capacità iniziale e il numero di valori da aggiungere. Poi leggi altrettanti valori interi e inseriscili uno per uno nel tuo DynamicArray. Dopo aver aggiunto tutti i valori, stampa:"Size: <size>""Capacity: <capacity>""Elements: <e1> <e2> ..."(tutti gli elementi separati da spazi)
Il formato dell'input sarà:
- Prima riga: capacità iniziale (intero)
- Seconda riga: numero di valori da aggiungere (intero)
- Righe successive: un valore intero per riga
Quando ridimensioni l'array, dovrebbe raddoppiare la sua capacità. Per esempio, se inizi con una capacità pari a 2 e inserisci un terzo elemento, la capacità dovrebbe diventare 4. Questo dimostra il principio RAII. La classe acquisisce memoria nel costruttore e la rilascia nel distruttore, assicurando che non si verifichino perdite di memoria.
Includi il file header in main.cpp usando #include "DynamicArray.h".
Provalo tu
#include <iostream>
#include "DynamicArray.h"
using namespace std;
int main() {
// Leggi la capacità iniziale
int initialCapacity;
cin >> initialCapacity;
// Leggi il numero di valori da aggiungere
int numValues;
cin >> numValues;
// TODO: Crea un DynamicArray con la capacità iniziale
// TODO: Leggi numValues interi e aggiungi ciascuno all'array
// TODO: Stampa "Size: <size>"
// TODO: Stampa "Capacity: <capacity>"
// TODO: Stampa "Elements: <e1> <e2> ..." (tutti gli elementi separati da spazi)
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