Newsgroup: it.comp.lang.c++
Titolo: Operatore new

Ciao a tutti,
utilizzazndo l'operatore new e' possibile allocare un array di oggetti e
fargli richiamare il costruttore di ognuno di questi contemporaneamente.
Quello che so e' che e' possiblie fare una cosa del genere:
// supponiamo che A abbia piu' di un costruttore
// e che uno di questi accetti un valore di tipo intero
class A
{...};
main...
{
    // allocazione di un oggetto di classe A
    A* pa = new A;
    // allocazione di un oggetto di classe A ed inizializzazione
    // dello stesso tramite il costruttore di cui sopra
    A* pa = new A(1);
    // allocazione di un'arrray di oggetti di classe A
    A* pa = new A[n_obj];
// fin qui tutto OK, ma se volessi allocare un'array di oggetti di classe A
// ed inizializzarli, come nel secondo caso, tramite il costruttore che
accetta
// un valore di tipo intero, quale potrebbe essere, o meglio e', la sintassi
// da utilizzare?
}
grazie anticipatamente, Franco.
Franco Torrini - Software Engineer - 
f.to...@virtuart.it
VIRTUART - C.C.D. Creative Computer Design S.p.A.
Via di Quarto Annunziata, 80/b - 00189 Rome, Italy
Tel. 
+39 06 33076638
 - Fax. 
+39 06 33076670

fargli richiamare il costruttore di ognuno di questi contemporaneamente.
Purtroppo non e' possibile passare dei parametri al costruttore quando si
alloca un vettore.
Possibili alternative che vedo:
1) se puoi modificare la classe, aggiungi un costruttore senza parametri ed
una funzione di inizializzazione, tipo 'Create(parametri...); quindi chiama
la 'Create' per ogni oggetto allocato;
class A;
A* v = new A[n];
for (int i = 0; i < n; i++)
   v[i].Create(...);
2) se non puoi modificare la classe, alloca un vettore di puntatori ed
alloca ogni singolo elemento del vettore usando il costruttore con i
parametri
A** v = new A*[n];
for (int i = 0; i < n; i++)
   v[i] = new A(...);
In questo caso si spreca un po' di spazio perche' si memorizza un
"puntatore" per ogni elemento ed anche l'accesso agli elementi e' piu' lento
(si fa per dire, naturalmente...).
Ciao,
Angelo.

Ciao Angelo,
grazie per la risposta, avevo il dubbio che non si potesse fare, ma cercavo
una conferma, comunque la classe e' nel progetto che sto sviluppando, quindi
posso modificarla come e quando voglio.
La prima delle alternative che hai proposto e' poi anche quella che ho
imlementato nell'attesa di una risposta, chiamando la funzione membro in un
ciclo subito dopo avere allocato l'array.
Thanks.
ciao, Franco.


fargli richiamare il costruttore di ognuno di questi contemporaneamente.
No (intendendosi, come tu intendi, un ctor non di default).
La soluzione in C++ Standard e` di usare std::vector, che ti
permette di fare esattamente cio` che desideri (se vuoi che
le inizializzazioni avvengano con diversi parametri, dovrai
passare un oggetto di una classe ad hoc che "incrementa"
le cose internamente).  Usa "#include <vector>" per avere
a disposizione la std::vector (e, se vuoi, "using std::vector;"
per poterlo chiamare solo vector senza std:: davanti).
Se non vuoi programmare in C++ Standard, presumibilmente
perche` il compilatore a tua disposizione e` antediluviano
(non vedo alcuna altra ragione sensata), l'unica e`:
-- alloca lo spazio (N*sizeof(Oggetto)) con ::operator new
-- loop sullo spazio allocato, usando esplicitamente un
    opportuno placement-ctor per i vari oggetti nello "spazio"
    che per ciascuno hai appena reso disponibile
Si tratta naturalmente di una "soluzione" di bassissimo
livello, ma e` giusto, poiche` appunto questo sono gli
"array" del C++ (quelli built-in): un meccanismo di livello
bassissimo, che e` nel linguaggio, sostanzialmente, al
fine di permettere la costruzione, in opportune librerie,
di "contenitori", meno di basso livello, dal comportamento
piu` ragionevole (e nella stragrande maggioranza dei
casi basta il "contenitore ragionevole" che gia` la libreria
standard del linguaggio ti fornisce, cioe` std::vector).
Alez