2009-11-28 35 views
5

Tôi đang sử dụng C++ để tạo bản đồ ô cho trò chơi. Vấn đề của tôi là, tôi muốn cư trú một mảng đa chiều của ints trong constructor Map, nhưng nó không hoạt động đúng. Đây là mã của tôi trong "Map.h" (mã không liên quan đã bị xóa).mảng intulating là biến thành viên

class Map { 

private:  
int mapArray[15][20]; 

}; 

Và mã của tôi từ Map.cpp

Map::Map() 
{ 

    mapArray = { 
     { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
     { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
     { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
     { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
     { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
     { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
     { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
     { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
     { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
     { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
     { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
     { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
     { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
     { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
     { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    }; 


} 

PS. tạo mapArray cục bộ, bên trong một hàm thành viên sử dụng int mapArray [15] [20] và populating nó sau đó hoạt động tốt, tôi dường như không thể đưa nó vào trong constructor, với một biến member.

PPS. Rất gỉ với C++, hãy nhẹ nhàng.

Tôi đang làm gì sai?

Xin cảm ơn, James.

+0

Nếu bạn không thay đổi giá trị mảng từ đối tượng thành đối tượng, thì điều bạn thực sự cần là mảng thành viên * tĩnh *. Xem câu trả lời của Mads. – AnT

+0

Nếu chúng là tất cả các số thứ tự, nó có thể đơn giản hơn chỉ để viết một vòng lặp (một mảng hai chiều là tiếp giáp trong bộ nhớ, vì vậy bạn thậm chí không cần các vòng lồng nhau). (Nếu những giá trị này sẽ không thay đổi, có thể sẽ rẻ hơn để tính toán chúng hơn là tìm kiếm chúng.) – UncleBens

+0

Chúng sẽ không luôn luôn được tuần tự. Chúng chỉ là giá trị thử nghiệm. –

Trả lời

6

Bạn không thể sử dụng công cụ khởi tạo mảng như vậy trong hàm tạo lớp. Thành viên chỉ có thể được khởi tạo bằng cách sử dụng danh sách khởi tạo. Đặt cược tốt nhất của bạn là tải dữ liệu này từ một tệp hoặc để khai báo mảng đó là tĩnh.

class Map 
{ 
private: 
static int mapArray[15][20]; 
/* ... */ 
}; 

Sau đó, xác định lưu trữ cho các mảng tĩnh trong một tập tin nguồn (cpp), còn được gọi là một đơn vị dịch thuật:

int Map::mapArray[15][20] = { ... }; 
+0

Cảm ơn Mads, bây giờ tôi sẽ chỉ làm cho mảng tĩnh và nhìn vào tải nó từ một tập tin khi tôi nhận được thêm cùng. Cảm ơn sự giúp đỡ của bạn: D –

2

Bạn có thể sử dụng cú pháp cú đúp chỉ để khởi tạo.

Khi hàm tạo của bạn được thực thi, thành viên mảng đã được tạo ra.

0

Bạn chỉ có thể sử dụng cú pháp cú đúp xoăn nếu bạn đang khởi tạo mảng lúc khai báo. Trong constructor của bạn, bạn không. Bạn có thể muốn tải dữ liệu bản đồ từ một tệp anyways thay vì mã hóa cứng.

5

Bạn sẽ có thể làm điều gì đó như thế này:

class Map 
{ 
    int mapArray[15][20]; 

    public: 
    Map() : mapArray((int[15][20]) { 
    { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
    { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
    { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
    { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
    { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
    { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
    { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
    { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
    { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
    { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
    { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
    { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
    { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
    { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
    { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    }) 
    { 
    } 
}; 

Lưu ý rằng kiểu khởi tạo này là một phần của C99 và có thể không được bao gồm trong trình biên dịch của bạn hoặc có thể không hoạt động với C++. Làm việc trên GCC 4 cho tôi.

Cũng lưu ý rằng tôi không biên dịch mã này. Tôi thích nghi nó cho trường hợp của bạn từ một số mã khác của tôi mà làm việc mặc dù.

+1

Chúa ơi, thật khủng khiếp. Nhưng chính xác và hữu ích. +1 –

+0

Có phải đã quyết định rằng các chữ ghép hợp chất biến nó thành C++ 0x? Thời gian qua tôi đã kiểm tra các văn bản compund bị từ chối bởi C++ 0x (tôi có thể đứng sau những phát triển mới nhất) – AnT

+0

Tôi đã sử dụng cú pháp này trong nhiều năm nay và thậm chí dám gửi báo cáo lỗi cho các IDE không nhận ra nó. Cho đến nay tất cả đã sửa nó ;-) – hirschhornsalz

1

Thật không may, không có cú pháp để làm chính xác điều đó trong C++ cho mảng không phải thành viên tĩnh. Bạn có thể gán các giá trị ban đầu cho từng thành viên mảng, nhưng điều đó, tất nhiên, khá cồng kềnh.

Nếu giá trị mảng giống nhau trong tất cả các đối tượng của lớp đó, thì bạn có thể cần một mảng thành viên static. Xem câu trả lời từ Mads sau đó.

Nếu bạn thực sự cần một mảng thành viên không tĩnh, có nghĩa là bạn muốn có thể "tùy chỉnh" nội dung của mảng trên cơ sở từng đối tượng bằng cách sửa đổi nó sau hoặc bằng cách khởi tạo nó khác, thì bạn có thể thử làm điều này

class Map { 
    static const int MapArrayInit[15][20]; 
    int MapArray[15][20]; 

public: 
    Map() 
    { 
    assert(sizeof MapArray == sizeof MapArrayInit); // better: STATIC_ASSERT 
    std::memcpy(MapArray, MapArrayInit, sizeof MapArray); 
    // Now you can customize MapArray to your liking 
    } 
}; 

và thuộc một trong các tập tin thực hiện

const int Map::MapArrayInit = { /* whatever */ }; 

này sẽ đòi hỏi thêm bộ nhớ cho MapArrayInit, nhưng kể từ khi bạn đang instatiating một riêng biệt MapArray trong mỗi trường hợp của Map dù sao nó không phải là một việc lớn.

Nếu bạn không muốn thay đổi MapArray của bạn sau khi khởi tạo nhưng vẫn muốn có các phiên bản khác nhau của MapArray nội dung trong những trường hợp khác nhau của `Bản đồ', bạn có thể sử dụng các phương pháp sau đây

class Map { 
    static const int MapArrayInit1[15][20]; 
    static const int MapArrayInit2[15][20]; 
    static const int MapArrayInit3[15][20]; 
    const int (&MapArray)[15][20]; // or a pointer 

public: 
    Map() : MapArray(MapArrayInit1) /* or 2, or 3 */ 
    { 
    } 
}; 

và trong một trong những tệp triển khai

const int Map::MapArrayInit1 = { /* whatever */ }; 
const int Map::MapArrayInit2 = { /* whatever */ }; 
const int Map::MapArrayInit3 = { /* whatever */ }; 

Chọn bất kỳ điều gì phù hợp nhất với bạn.

0

Đây là bài tập, không phải là khởi tạo. Khởi tạo cú đúp đơn giản chỉ hoạt động trong khi khởi tạo. Sử dụng cú pháp ngữ pháp hợp chất, giống như một kiểu chữ (để tổng hợp bạn muốn khởi tạo), theo sau là một bộ khởi tạo dấu ngoặc đơn.

Map::Map() 
{ 

    mapArray = (int[15][20]) { 
     { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19 }, 
     { 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39 }, 
     { 40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59 }, 
     { 60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 }, 
     { 80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99 }, 
     { 100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119 }, 
     { 120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139 }, 
     { 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159 }, 
     { 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179 }, 
     { 180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199 }, 
     { 200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219 }, 
     { 220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239 }, 
     { 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259 }, 
     { 260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279 }, 
     { 280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299 } 
    };  
} 
Các vấn đề liên quan