Как определить статический массив без постоянного размера в конструкторе класса? (С++)

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

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]

person Community    schedule 02.04.2010    source источник
comment
Будет ли каждый объект Obj иметь постоянную ширину и высоту?   -  person jpalecek    schedule 03.04.2010
comment
После определения ширины и высоты они не будут изменены, но каждый объект будет иметь разную ширину и высоту.   -  person    schedule 03.04.2010
comment
Можете ли вы показать нам использование? Как вы получаете размеры массива во время компиляции?   -  person GManNickG    schedule 03.04.2010


Ответы (3)


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

template <int W, int H>
class Obj {
public:
    // ...
private:
    int presc[W][H];
}
person Marcelo Cantos    schedule 02.04.2010
comment
Это то же самое, что и исходный код, только украшенный шаблонами. Если бы он знал w и h во время компиляции, его исходный код мог бы использовать все, что вы подставили вместо параметров шаблона. - person Ben; 03.04.2010
comment
На самом деле w/width и h/height известны во время компиляции (извините, если я сначала не понял). Идея состоит в том, что я буду знать значения h и w для конкретного объекта во время компиляции, просто они не будут одинаковыми для каждого объекта, и поэтому я должен использовать переменные для размера. - person ; 03.04.2010
comment
@ Бен, что плохого в том, чтобы предложить правильный ответ, который не пришел в голову ОП? - person Marcelo Cantos; 03.04.2010
comment
Я написал ответ до того, как ОП обновил вопрос, чтобы было ясно, что ему нужно несколько версий класса с разными h и w. Использование шаблонного класса — действительно лучшее решение. - person Ben; 05.04.2010
comment
Спасибо за согласие, @Ben. Но чтобы было ясно, я также написал свой ответ до того, как ОП разъяснил требование. Вот почему я предварил свой пример кода, если вы знаете h и w во время компиляции. - person Marcelo Cantos; 06.04.2010

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

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

person James McNellis    schedule 02.04.2010
comment
Я знаю размер массива во время компиляции, просто он не будет одинаковым для каждого объекта, поэтому я не могу использовать постоянную переменную. - person ; 03.04.2010
comment
@Keand64: В этом случае у вас есть возможность использовать шаблон для установки ширины и высоты во время компиляции, как Марсело демонстрирует в своем ответе. Цена этого заключается в том, что объекты с разными размерами массива имеют разные типы. Вы можете обойти это, используя наследование, но это может привести к путанице. - person James McNellis; 03.04.2010

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

person Dennis Zickefoose    schedule 03.04.2010