2011-09-26 44 views
8

Tôi hiện đang làm việc trên một trò chơi thẻ, và tôi đang gặp rắc rối với một số mã khởi tạo:Khởi tạo một mảng của các đối tượng

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

Vấn đề là trình biên dịch của tôi nói với tôi rằng cards++ không phải là một l -giá trị. Tôi đã đọc lên trên toàn bộ mảng tương đương với mảng con trỏ, và tôi nghĩ tôi đã hiểu nó, nhưng than ôi, tôi không thể làm cho nó hoạt động được. Sự hiểu biết của tôi là vì cards giảm xuống con trỏ và toán tử new cho tôi con trỏ đến vị trí của phiên bản Thẻ mới của tôi, khi đó mã trên phải biên dịch. Đúng?

Tôi cũng đã thử sử dụng một subscript, nhưng không phải là cards+i, cards++cards[i] chỉ 3 cách để nói điều tương tự? Tôi nghĩ rằng mỗi cái trong số đó là giá trị l và được coi là con trỏ.

+1

thẻ + tôi trả lại thẻ + i; thẻ ++ increments thẻ của một; Thẻ [i] trả về một tham chiếu đến phần tử thứ i trong thẻ. Tất cả đều khác nhau. –

Trả lời

15
Card cards[20]; 

cards đã là một mảng đối tượng. Chúng được xây dựng với hàm tạo mặc định (hàm tạo không có đối số). Không cần phải new nữa. Có lẽ bạn cần một hàm thành viên tương đương với các đối số hàm tạo và gán thông qua nó.

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

Thậm chí đơn giản là sử dụng std::vector

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

Tôi đã tìm ra một véc tơ sẽ là một ý tưởng tốt hơn. Vì vậy, tôi đã thử sử dụng một vector, nhưng bây giờ tôi đang nhận được một cái gì đó tôi đã chạy vào rất nhiều: Một khi tôi bao gồm , tôi nhận được một danh sách các lỗi "bên ngoài chưa được giải quyết" điên từ libcpmtd.lib. Điều này cho tôi biết không có gì sai với mã MY, nhưng tôi vẫn không biên dịch ... Ugh. –

+1

Tôi muốn sử dụng std :: vector và bây giờ là số phần tử được thêm vào, KHÔNG SỬ DỤNG push_back: Chi phí nhỏ nhưng tránh được. Bạn nên khởi tạo véc tơ với kích thước phù hợp 'std :: vector thẻ (20);' và sau đó khởi tạo các thành viên giống như cách bạn đã làm cho Array. –

3

Card cards[20]; đã tạo ra một mảng của 20 Card đối tượng và tạo ra chúng với các nhà xây dựng mặc định. Đây có thể không phải là những gì bạn muốn cho mã của bạn.

Tôi khuyên bạn nên sử dụng vector để thay thế.

std::vector<Card> cards; 

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

Lưu ý rằng for vòng lặp của bạn đi 0-20 và do đó một quá khứ cuối mảng.

0

Nếu bạn muốn tránh các cú pháp không cần thiết, hãy gọi số thay đổi kích thước không cần thiết, sau đó nó phức tạp hơn, vì C++ thường khởi động từng đối tượng một khi nó được cấp phát. Một cách giải quyết là để làm điều đó một cách Java - sử dụng một vòng lặp và một mảng của con trỏ, như vậy:

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

Một lựa chọn khác là sử dụng malloc để có được bộ nhớ một cách rõ ràng chưa được khởi tạo:

Card *cards = malloc(20 * sizeof(Card)); 
for (int i=0; i<20; i++) { 
    new (&(cards[i])) Card(i); 
} 
Các vấn đề liên quan