2011-09-26 21 views
8

Attualmente sto lavorando su un gioco di carte, e sto avendo problemi con alcuni codice di inizializzazione:inizializzazione un array di oggetti

// in my class... 
Card cards[20]; 
// in method... 
for(int i = 0; i <= 20;i++) 
    cards++ = new Card(i, /*i as char +*/ "_Card.bmp"); 

Il guaio è che il mio compilatore che mi diceva che cards++ non è un l -valore. Ho letto sull'intera cosa dell'equivalenza del puntatore e ho pensato di averlo capito, ma purtroppo non riesco a farlo funzionare. La mia comprensione è che poiché cards si riduce a un puntatore e l'operatore new mi dà un puntatore alla posizione della mia nuova istanza di Card, quindi il codice sopra riportato dovrebbe essere compilato. Destra?

Ho provato a utilizzare anche un pedice, ma non è cards+i, cards++ e cards[i] solo 3 modi di dire la stessa cosa? Ho pensato che ognuno di questi fosse un valore di l e sono trattati come indicatori.

+1

carte + restituisco le carte + i; le carte ++ aumentano le carte di una unità; le carte [i] restituiscono un riferimento all'elemento i'th nelle carte. Sono tutti diversi. –

risposta

15
Card cards[20]; 

cards è già una matrice di oggetti. Sono costruiti con il costruttore predefinito (costruttore senza argomenti). Non è necessario ripetere il numero new. Probabilmente hai bisogno di una funzione membro equivalente agli argomenti del costruttore e assegnarla attraverso di essa.

for (int i=0; i<20; ++i) // array index shouldn't include 20 
    cards[i].memberFunction(/*....*/); 

Ancora più semplice è quello di utilizzare std::vector

std::vector<Card> cards; 
for(int i=0; i<20; ++i) 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp");) 
+0

Ho pensato che un vettore sarebbe stato un'idea migliore. Così ho provato ad usare un vettore, ma ora sto ottenendo qualcosa che ho trovato in un sacco: una volta ho incluso , ottengo un elenco di errori "esternamente irrisolti" dall'aspetto pazzo da libcpmtd.lib. Questo mi dice che non c'è niente di sbagliato con il mio codice, ma non lo compilerò ancora ... Ugh. –

+1

Se si desidera utilizzare std :: vector e ora il numero di elementi da aggiungere, NON USARE push_back: l'overhead è piccolo ma evitabile. Dovresti inizializzare il vettore alla dimensione giusta 'std :: vector carte (20);' e quindi inizializzare i membri nello stesso modo in cui lo hai fatto per la matrice. –

3

Il codice Card cards[20]; crea già un array di 20 Card oggetti e crea con il costruttore di default. Questo potrebbe non essere quello che vuoi dato il tuo codice.

Suggerirei invece di utilizzare vector.

std::vector<Card> cards; 

for(int i = 0; i < 20;i++) 
{ 
    cards.push_back(Card(i, /*i as char +*/ "_Card.bmp")); 
} 

Si noti che il ciclo for va 0-20 e quindi uno oltre la fine della matrice.

0

Se si desidera evitare chiamate del costruttore non necessarie e ridimensionamento non necessario, quindi è più complicato, in quanto normalmente C++ inizializza ogni oggetto uno per uno come è allocato. Una soluzione è quella di farlo nel modo Java - utilizzare un ciclo e una serie di puntatori, in questo modo:

Card *cards[20]; 
for (int i=0; i<20; i++) { 
    cards[i] = new Card(i); 
} 

Un'altra opzione è quella di utilizzare malloc per ottenere la memoria non inizializzata esplicitamente:

Card *cards = malloc(20 * sizeof(Card)); 
for (int i=0; i<20; i++) { 
    new (&(cards[i])) Card(i); 
} 
Problemi correlati