2013-04-24 11 views
5

Ho una classe denominata le carte da gioco che eredita da una classe di carte. L'ho istanziato come un oggetto chiamato chuckcards. Uno dei membri dati è CARD ID. Sto cercando di assegnare un valore int al valore. è dichiarato pubblico in classe. Ecco come è stato istanziato.dando un oggetto di classe un valore C#

playingcards[] chuckcards = new playingcards[10];

Ecco come cerco di assegnare valori.

for (int ctr = 1; ctr < 10; ctr++) 
     { 

      chuckcards[ctr].cardID = ctr; 

      temp++; 
     } 

L'errore ottengo è

riferimento non impostato a un un'istanza di un oggetto.

Non so cosa sto facendo male? Potrei creare un metodo che assegni il valore a ciascun membro? se è così che sarà un dolore per certe cose ma potrei farlo? o è il loro un modo semplice?

risposta

7

Quando si chiama new playingcards[10], si crea solo segnaposto che hanno il difetto di quel tipo, che è null per i tipi di riferimento. Avrete in realtà nuove fino playingcards poi utilizzano per ad esso

for (int ctr = 1; ctr < 10; ctr++) 
    { 
     chuckcards[ctr] = new playcards{cardID=ctr}; 
     temp++; 
    } 

ho usato un inizializzatore oggetto per semplificare il codice verso il basso per una linea anche.

Ecco cosa succede:

var chuckcards = new playingcards[10]; 

risultati nella seguente:

chuckcards[0] = null 
... 
chuckcards[9] = null 

Quindi, non si può fare

chuckcards[0].cardID 

perché è davvero

null.cardID 

Quindi, una volta che si inizializza il valore che avrà un riferimento da quel momento in poi:

chuckcards[0] = new playingcards(); 
chuckcards[0].cardID = ctr; 

viene valutato come

[ref to playingcards].cardID 

valido

+0

Grazie. Quindi sto creando le istanze individuali? Dovrei farlo di nuovo, una volta? O dire che sono andato a fare 'chuckcards [0] .cardName =" Chuck "; dovrei averlo di nuovo? Anche eventuali collegamenti per l'aiuto con la sintassi sarebbero fantastici :) – Yop

+0

no, solo sull'inizializzazione. Sto aggiungendo alla mia risposta per spiegare meglio –

+0

OK, speriamo che la risposta attuale lo spieghi abbastanza bene per voi –

4

è necessario dare chuckcards[ctr] un'istanza di oggetto:

chuckcards[ctr] = new playingcards(); 
chuckcards[ctr].cardID = ctr; 
5

È stato definito un array di 10 slot per contenere istanze di carte da gioco, ma ogni spazio è ancora nullo
Prima di entrare nel ciclo è necessario aggiungere un'istanza in ogni slot con

chuckcards[0] = new playingcards(); 

e così via ..... (1,2, ...9 = indice max)

casualmente si potrebbe verificare all'interno del ciclo se sono stati assegnati un'istanza di un particolare slot o meno

for (int ctr = 0; ctr < 10; ctr++) 
{ 
    if(chuckcards[i] != null) 
    { 
     chuckcards[ctr].cardID = ctr; 
     temp++; 
    } 
} 

E ricordate, inizio indice dell'array a zero non in uno

+0

I capito che dopo aver postato grazie :) – Yop

3

chuckcards [ctr] è nullo, è necessario creare un'istanza

playingcards[] chuckcards = new playingcards[10]; 

for (int ctr = 0; ctr < 10; ctr++) 
{ 
    chuckcards[ctr] = new playingcards(); 
    chuckcards[ctr].cardID = ctr; 
} 
2

I chuckcards [ctr] è nullo. Devi installarlo.

for (int ctr = 1; ctr < 10; ctr++) 
{ 
    chuckcards[ctr] = new playingcards(); 
    chuckcards[ctr].cardID = ctr; 
    temp++; 
} 

Per avere meno codice, è possibile creare un altro costruttore che necessita di un ID. Quindi:

for (int ctr = 1; ctr < 10; ctr++) 
{ 
    chuckcards[ctr] = new playingcards(ctr); 
    temp++; 
} 
Problemi correlati