MEC++: Quando definire il default ctor

Appunti tratti dalla rilettura di More Effective C++ di Scott Meyers. Primo blocco: Fondamentali.

(4) Se non c'é bisogno, non definire un default ctor

Se una classe manca del costruttore di default, si complica la creazione di array di quel tipo, dato che alla creazione dell'array viene implicitamente chiamato il default ctor per ogni elemento.

Ma si può superare il problema invocando esplicitamente il costruttore con un opportuno parametro per ogni elemento. Ma questo vale solo per array sullo stack.

Oppure si può pensare di usare un array di puntatori, delegando la loro inizializzazione ad un susseguente ciclo for. Questo approccio porta ad un piccolo aumento della memoria necessaria per la gestione dell'array e, soprattutto, crea la necessità di ricordarsi di distruggere tutti gli elementi esplicitamente, al termine del suo uso.

Si può evitare lo spreco di memoria usando la "placement new", a patto di rendere il codice meno leggibile. Soprattutto la distruzione degli oggetti risulta strana, dato che bisogna invocare esplicitamente il distruttore per ogni elemento, e farlo in ordine inverso rispetto alla costruzione.

Lo schema da seguire é questo:
  • si alloca la memoria per lo spazio richiesto (n * dimensione della classe);
  • si converte via static_cast il puntatore risultate ad un puntatore alla classe;
  • si chiama espilicitamente il costruttore per ogni oggetto via "placement new";


for(int i = 0; i < n; ++i)
new(&array[i] MyClass( ... );

Alla fine dell'uso dell'array:
si chiama il distruttore esplicitamente

for(int i = n; i >= 0; --i)
array[i].~MyClass();

si dealloca la memoria:

operator delete[](rawMemory);


Un secondo problema per una classe senza default ctor é che non può essere usata con svariati container STL.

Il terzo problema é per le classi virtuali alla base di una gerarchia. Se non hanno il costruttore di default, l'intera gerarchia risulta più difficile da gestire.

Nonostante tutti questi problemi, é molto meglio incorrere in queste seccature, che quelle derivanti dall'avere un default ctor che non ha senso.

Nessun commento:

Posta un commento