PDA

View Full Version : [C++] Creare array di oggetti usando puntatori


Lews Therin Telamon
23-09-2010, 16:16
Ciao ragazzi, sono 2-3 mesi che non programmavo in C++, e ora mi sono imbarcato in un progettino, ma mi sono bloccato su una cosa che dovrebbe essere una scemenza, ma che non mi funziona.

Praticamente, diciamo che io ho creato una classe, per esempio una classe che rappresenta i numeri complessi, e vorrei creare un array di questi oggetti usando il comando new. Dando per scontato che ho incluso i file necessari al funzionamento della classe complex creata da me, quello che faccio è questo


int dim;
cout << "Quanti numeri complessi si desidera creare? ";
cin >> dim;
complex * p = new complex [dim];
for (int i=0; i<dim; i++)
{
p[i] = complex (i,i);
cout << "Numero " << p[i] << endl;
}


quindi, faccio inserire all'utente la dimensione dell'array (l'intero dim), creo un puntatore a oggetti di tipo complex che si chiama p, e provo ad "attaccarci" appunto un vettore di complex di dimensione pari a dim usando new. Il compilatore però mi dà quest'errore

no matching function for call to `complex::complex()'
candidates are: complex::complex(const complex&)
complex::complex(double, double)

alla riga dell'istruzione
complex * p = new complex [dim]

insomma, mi pare di capire che fraintenda l'istruzione new complex [dim], ma non capisco dove sbaglio!:confused:

Grazie in anticipo!

tuccio`
23-09-2010, 16:22
http://www.cplusplus.com/reference/std/new/operator%20new%5B%5D/

operator new[] can be called explicitly as a regular function, but in C++, new[] is an operator with a very specific behavior: An expression with new and an array type specifier is an operator new[] expression. This, first calls function operator new[] with the size of its array type specifier as first argument (plus any array overhead storage to keep track of the size, if any), and if this is successful, it then automatically initializes or constructs each of the objects in the array (if needed). The expression evaluates as a pointer to the appropriate type pointing to the first element of the array.

new[] richiama il costruttore senza argomenti per ogni oggetto, ma nel tuo caso non c'è

Lews Therin Telamon
23-09-2010, 16:31
Fammi capire, quindi quando uso new il compilatore cerca per prima cosa di creare una lista di complex, usando però non il costruttore che ho creato io (che ha la sintassi complex(double,double) ) ma un ipotetico costruttore senza argomenti complex()?

Porca miseria, questa cosa non la sapevo:doh: ...sapreste mica dirmi allora come ci si regola in questi casi?

EDIT: OK, credo di aver risolto, ho semplicemente creato un costruttore complex() che....beh, che non fa proprio niente!
Non so se sia "elegante" o generalmente usata come soluzione, ma se non altro ora compila e fa quello che voglio....quindi, consiglio generale a quelli di voi che sono più pratici di programamzione. Per prevenire problemi del genere, è sempre opportuno includere un costruttore "vuoto" quando si crea una classe?