2013-04-24 41 views
5

Tôi có một lớp được gọi là các thẻ chơi mà nó kế thừa từ một lớp thẻ. Tôi khởi tạo nó như một đối tượng được gọi là chuckcards. Một trong những thành viên dữ liệu là ID CARD. Tôi đang cố gắng gán một int cho giá trị. nó được khai báo public int class. Đây là cách nó được khởi tạo.cho đối tượng lớp một giá trị C#

playingcards[] chuckcards = new playingcards[10];

Sau đây là cách tôi cố gắng gán giá trị.

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

      chuckcards[ctr].cardID = ctr; 

      temp++; 
     } 

Các lỗi tôi nhận được là

Object tài liệu tham khảo không được đặt để một thể hiện của một đối tượng.

Tôi không biết mình đang làm gì sai? Tôi có thể tạo phương thức gán giá trị cho từng thành viên không? nếu vậy đó sẽ là một nỗi đau cho những thứ nhất định nhưng tôi có thể làm điều đó? hoặc là cách đơn giản của họ?

Trả lời

7

Khi bạn gọi new playingcards[10], nó chỉ tạo ra placeholders có mặc định của loại hình đó, đó là null với nhiều loại tài liệu tham khảo. Bạn sẽ phải thực sự tạo các thẻ chơi mới để sử dụng nó

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

Tôi đã sử dụng trình khởi tạo đối tượng để đơn giản hóa mã xuống thành một dòng.

Đây là những gì sẽ xảy ra:

var chuckcards = new playingcards[10]; 

Kết quả trong những điều sau đây:

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

Vì vậy, bạn không thể làm

chuckcards[0].cardID 

vì nó thực sự là

null.cardID 

Vì vậy, một khi bạn khởi tạo giá trị nó sẽ có một tài liệu tham khảo từ đó trở đi:

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

đánh giá để

[ref to playingcards].cardID 

có giá trị

+0

Cảm ơn bạn. Vì vậy, tôi đang tạo ra các trường hợp indivdual? Tôi sẽ phải làm mới nó một lần sau đó? Hoặc nói rằng tôi đã đi để làm 'chuckcards [0] .cardName =" Chuck ";' tôi sẽ phải làm điều đó một lần nữa? Bất kỳ liên kết nào để được trợ giúp về cú pháp cũng sẽ tuyệt vời :) – Yop

+0

không, chỉ khi khởi tạo. Tôi đang thêm vào câu trả lời của tôi để giải thích tốt hơn –

+0

OK, hy vọng câu trả lời hiện tại giải thích nó đủ tốt cho bạn –

4

Bạn cần phải cung cấp cho chuckcards[ctr] một trường hợp đối tượng:

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

Bạn đã xác định một mảng của 10 khe để giữ các phiên bản của các thẻ chơi, nhưng mọi chỗ trống vẫn là số
Trước khi vào vòng lặp, bạn cần thêm một cá thể vào mỗi khe với

chuckcards[0] = new playingcards(); 

và vân vân ..... (1,2, ...9 = chỉ số max)

cuối cùng bạn có thể kiểm tra bên trong vòng lặp nếu bạn đã gán một ví dụ để một khe cắm đặc biệt hay không

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

Và hãy nhớ, bắt đầu chỉ số mảng tại zero không phải ở một

+0

tôi nhận ra rằng sau khi gửi bài cảm ơn bạn :) – Yop

3

chuckcards [ctr] là null, bạn phải khởi tạo nó

playingcards[] chuckcards = new playingcards[10]; 

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

Dấu ngoặc đơn [ctr] là rỗng. Bạn cần phải instanciate nó.

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

Để có ít mã hơn, bạn có thể tạo một hàm tạo khác cần id. Sau đó, bạn có:

for (int ctr = 1; ctr < 10; ctr++) 
{ 
    chuckcards[ctr] = new playingcards(ctr); 
    temp++; 
} 
Các vấn đề liên quan