2009-11-28 3 views
5

Я использую C++ для создания карты плитки для игры. Моя проблема заключается в том, что я хочу заполнить многомерный массив ints в конструкторе Map, но он работает неправильно. Вот мой код в «Map.h» (неактуальный код удален).populating int array, который является переменной-членом

class Map { 

private:  
int mapArray[15][20]; 

}; 

И мой код из 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. создавая mapArray локально, внутри функции-члена, используя int mapArray [15] [20] и заполняя ее, тогда работает нормально, я просто не могу заставить его заполнить в конструкторе переменную-член.

PPS. Очень ржавый с C++, будьте осторожны.

Что я делаю неправильно?

Thanks, James.

+0

Если вы не собираетесь изменять значения массива из объекта в объект, то вам действительно нужен массив * static *. См. Ответ Мэдс. – AnT

+0

Если это все порядковые номера, проще всего написать цикл (двумерный массив смежен в памяти, поэтому вам даже не нужны вложенные циклы). (Если эти значения не будут меняться, это может быть дешевле вычислить их, чем искать их.) – UncleBens

+0

Они не всегда будут последовательными. Это всего лишь тестовые значения. –

ответ

6

Вы не можете использовать инициализаторы массивов, подобные этому в конструкторе класса. Члены могут быть инициализированы только с помощью списка инициализаторов. Лучше всего загрузить эти данные из файла или объявить массив как статический.

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

Затем определите хранилище для статического массива в исходном файле (.cpp), также известный как ЕП:

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

Спасибо, Mads, пока я просто сделаю массив статичным и посмотрю на его загрузку из файла, когда буду дальше. Спасибо за вашу помощь: D –

2

Вы можете использовать синтаксис привязки только для инициализации.

Когда ваш конструктор выполнен, элемент массива имеет alredy.

0

Вы можете использовать только фигурные скобки, если вы инициализируете массив при объявлении. В вашем конструкторе вы не. Вероятно, вы захотите загрузить данные карты из файла в любом случае вместо жесткого кодирования.

5

Вы должны быть в состоянии сделать что-то вроде этого:

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 } 
    }) 
    { 
    } 
}; 

Обратите внимание, что этот стиль инициализации является частью C99 и не может быть включен в ваш компилятор или может не работать для C++. Работает на GCC 4 для меня.

Также обратите внимание, что я не скомпилировал этот код. Я адаптировал его для вашего дела из другого кода, который действительно работает.

+1

Боже, это ужасно. Но верно и полезно, тем не менее. +1 – 2009-11-28 04:14:06

+0

Уже принято решение, что сложные литералы превращают его в C++ 0x? В прошлый раз, когда я проверял, что компилятивные литералы были отклонены C++ 0x (я мог бы отстать от последних разработок) – AnT

+0

Я использовал этот синтаксис уже много лет и даже осмелился подавать отчеты об ошибках в IDE, которые его не распознают. Пока все это исправили ;-) – hirschhornsalz

1

К сожалению, синтаксиса для синтаксиса для нестатических массивов членов не существует. Вы можете назначить начальные значения членам массива один за другим, но это, конечно, довольно громоздко.

Если значения массива одинаковы во всех объектах этого класса, вам, вероятно, понадобится массив элементов static. Тогда см. Ответ от Мадс.

Если вам действительно нужен нестатический массив элементов, что означает, что вы хотите «настроить» содержимое массива на основе каждого объекта, изменив его позже или инициализируя его по-другому, вы можете попробовать делая это

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 
    } 
}; 

и в одном из файлов реализации

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

Это потребует дополнительной памяти для MapArrayInit, но так как вы instatiating отдельный MapArray в каждом экземпляре Map в любом случае это не большая сделка.

Если вы не хотите изменить MapArray после инициализации, но по-прежнему хотят иметь несколько различных версий MapArray содержимого в различных случаях `Map», вы можете использовать следующий подход

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 */ 
    { 
    } 
}; 

и в один из файлов реализации

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

Выберите все, что лучше всего подходит для вас.

0

Это назначение, а не инициализация. Инициализаторы простой команды работают только во время инициализации. Используйте синтаксис сложного литерала, который похож на typecast (на агрегат, который вы хотите инициализировать), за которым следует инициализатор скобок.

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 } 
    };  
}