Задержка размера массива в определении класса в C ++? - PullRequest
5 голосов
/ 05 марта 2009

Есть ли способ отложить определение размера массива до метода или конструктора класса?

То, о чем я думаю, может выглядеть примерно так, что (конечно) не работает:

class Test
{
    private:
    int _array[][];

    public:
    Test::Test(int width, int height);
};

Test::Test(int width, int height)
{
    _array[width][height];
}

Ответы [ 4 ]

8 голосов
/ 05 марта 2009

Даниэль говорит о том, что вам нужно будет динамически выделять память для вашего массива при вызове метода 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;
8 голосов
/ 05 марта 2009

вектор твой лучший друг

class Test
{
    private:
    vector<vector<int> > _array;

    public:
    Test(int width, int height) :
        _array(width,vector<int>(height,0))
    {
    }
};
2 голосов
/ 05 марта 2009

Я думаю, вам пора поискать новые / удалить операторы.

Видя, что это многомерный массив, вам придется циклически вызывать вызов 'new' на ходу (и снова не забывать: удалить).

Хотя я уверен, что многие предложат использовать одномерный массив с элементами width * height.

1 голос
/ 07 августа 2009

(Месяцы спустя) можно использовать шаблоны, например:

// 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];

}
...