Задержка размера массива в определении класса в C ++?
Вопрос
Есть ли способ отложить определение размера массива до метода или конструктора класса?
То, о чем я думаю, может выглядеть примерно так, что (конечно) не работает:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
Решение
Даниэль говорит о том, что вам нужно динамически выделять память для вашего массива при вызове метода Test (ширина, высота). Р>
Вы бы объявили свое двумерное как это (предполагая массив целых чисел):
int ** _array;
А затем в вашем методе Test вам нужно будет сначала выделить массив указателей, а затем для каждого указателя выделить массив целых чисел:
_array = new *int [height];
for (int i = 0; i < height; i++)
{
_array [i] = new int[width];
}
И затем, когда объект будет освобожден, вам нужно будет явно удалить выделенную память.
for (int i = 0; i < height; i++)
{
delete [] _array[i];
_array [i] = NULL;
}
delete [] _array;
_array = NULL;
Другие советы
вектор - ваш лучший друг
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
Я думаю, вам пора поискать новые / удалить операторы.
Видя, что это многомерный массив, вам придется циклически вызывать вызов 'new' на ходу (и опять же не забывать: delete).
Хотя я уверен, что многие предложат использовать одномерный массив с элементами width * height.
(Месяцы спустя) можно использовать шаблоны, например так:
// array2.c
// http://www.boost.org/doc/libs/1_39_0/libs/multi_array/doc/user.html
// is professional, this just shows the principle
#include <assert.h>
template<int M, int N>
class Array2 {
public:
int a[M][N]; // vla, var-len array, on the stack -- works in gcc, C99, but not all
int* operator[] ( int j )
{
assert( 0 <= j && j < M );
return a[j];
}
};
int main( int argc, char* argv[] )
{
Array2<10, 20> a;
for( int j = 0; j < 10; j ++ )
for( int k = 0; k < 20; k ++ )
a[j][k] = 0;
int* failassert = a[10];
}