Как определить статический массив без постоянного размера в конструкторе класса? (C ++) - PullRequest
3 голосов
/ 03 апреля 2010

У меня есть класс, определенный как:

class Obj {
public:
    int width, height;
    Obj(int w, int h);
}

и мне нужно, чтобы он содержал статический массив, например:

int presc[width][height];

однако, я не могу определить в классе, так что можно создать указатель на 2D-массив (и, из любопытства, 3, 4 и 5D-массивы), иметь его в качестве члена класса, и оживить его в конструкторе, например:

int ar[5][6];
Obj o(5, 6, &ar);

РЕДАКТИРОВАТЬ: Идея здесь заключается в том, что каждый объект будет иметь разную ширину и высоту, поэтому массив, который я использую для представления этого объекта, будет уникальным для объекта, но как только этот массив будет определен (предпочтительно в конструкторе), он не изменится. А значения ширины и высоты для конкретного объекта известны во время компиляции.

РЕДАКТИРОВАТЬ: массивы предназначены для обнаружения столкновений путем наложения массивов presc двух объектов на один большой массив и определения места наложения, объявления выглядят так:

Obj player1(32, 32); //player with a width of 32 px and height of 32 px, presc[32][32]
Obj boss(500, 500); //boss with a width of 500 px and height of 500 px, presc[500][500]

Ответы [ 3 ]

4 голосов
/ 03 апреля 2010

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

Если вы не знаете размер массива до времени выполнения, вы не можете иметь этот массив в качестве члена класса (вам нужно динамически выделить массив и сохранить указатель на него в классе или желательно использовать std::vector).

2 голосов
/ 03 апреля 2010

Если под «динамическим» вы имеете в виду «выделенный в куче», то нет, с текущим Obj это невозможно. OTOH, если вы знаете w и h во время компиляции:

template <int W, int H>
class Obj {
public:
    // ...
private:
    int presc[W][H];
}
0 голосов
/ 03 апреля 2010

boost::array и std::tr1::array оба предоставляют массивы постоянного размера. Поймите, что они создают совершенно новые типы; отсутствие динамического массива, вероятно, сделает большую часть вашего кода более трудной для написания, чем это необходимо. Вы должны будете параметризовать свой класс, а также любые функции, которые работают с этими объектами. И все, что вы сэкономите, - это выделение одной кучи.

...