2013-04-24 18 views
5

Posiadam klasę zwaną kartami do gry, która dziedziczy z klasy kart. Przedstawiłem go jako obiekt zwany chuckcards. Jednym z członków danych jest ID KARTY. Próbuję przypisać wartość int do wartości. jest publicznie deklarowana w klasie. Oto, jak powstało.podając obiekt klasy o wartości C#

playingcards[] chuckcards = new playingcards[10];

Oto jak próbuję przypisać wartości.

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

      chuckcards[ctr].cardID = ctr; 

      temp++; 
     } 

Błąd pojawia się

Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Nie wiem, co robię źle? Czy mogę utworzyć metodę przypisującą wartość każdemu członkowi? jeśli tak, to będzie ból dla pewnych rzeczy, ale mogę to zrobić? czy jest to prosty sposób?

Odpowiedz

7

Po wywołaniu new playingcards[10], to tylko tworzy zastępczych, które mają domyślne tego typu, który jest null dla typów referencyjnych. Trzeba będzie faktycznie nowe górę playingcards aby następnie używać go

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

użyłem inicjatora obiektu w celu uproszczenia kodu w dół do jednej linii również.

Oto co się dzieje:

var chuckcards = new playingcards[10]; 

wyników w następujący:

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

więc nie można zrobić

chuckcards[0].cardID 

ponieważ jest naprawdę

null.cardID 

Tak, po inicjalizacji wartość będzie miała odniesienie odtąd:

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

ocenia się

[ref to playingcards].cardID 

który jest ważny

+0

Dziękuję. Więc tworzę indywidualne wystąpienia? Czy musiałbym kiedyś to zmienić? Lub powiedz, że poszedłem do zrobienia 'chuckcards [0] .cardName =" Chuck ";' czy mam to jeszcze raz zrobić? Wszelkie linki do pomocy przy składni też będą świetne :) – Yop

+0

nie, tylko przy inicjalizacji. Dodaję do mojej odpowiedzi, żeby wyjaśnić lepiej –

+0

OK, mam nadzieję, że obecna odpowiedź wyjaśni to wystarczająco dobrze dla ciebie –

4

Trzeba dać chuckcards[ctr] instancję obiektu:

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

Zdefiniowano tablicą z 10 szczelin do trzymania instancji kart do gry, ale każde gniazdo jest nadal nieważne
Przed wprowadzeniem pętli musisz dodać instancję w każdym gnieździe za pomocą

chuckcards[0] = new playingcards(); 

i tak dalej ..... (1,2, ...9 = wskaźnik max)

ostatecznie można sprawdzić wewnątrz pętli, jeśli przypisano wystąpienie do danego gniazda lub nie

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

I pamiętaj, początek indeks tablicy na zero, nie na jednym

+0

I zorientowałem się, że po zamieszczeniu dziękuję :) – Yop

3

chuckcards [ctr] ma wartość null, musisz go utworzyć.

playingcards[] chuckcards = new playingcards[10]; 

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

Karty chrapy [ctr] mają wartość zerową. Musisz to zainicjować.

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

Aby mieć mniej kodu, można utworzyć kolejny konstruktor wymagający identyfikatora. Następnie masz:

for (int ctr = 1; ctr < 10; ctr++) 
{ 
    chuckcards[ctr] = new playingcards(ctr); 
    temp++; 
} 
Powiązane problemy