5

有没有办法延迟定义数组的大小,直到类方法或构造函数?

我在想的可能看起来像这样,(当然)不起作用:

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

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

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

4 回答 4

8

Daniel 所说的是,当调用 Test (width, height) 方法时,您需要为数组动态分配内存。

你会像这样声明你的二维(假设整数数组):

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;
于 2009-03-05T06:21:16.473 回答
8

矢量是你最好的朋友

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

    public:
    Test(int width, int height) :
        _array(width,vector<int>(height,0))
    {
    }
};
于 2009-03-05T06:27:04.137 回答
2

我认为是时候查找新/删除运算符了。

鉴于这是一个多维数组,您将不得不在执行过程中循环调用“new”(同样不要忘记:delete)。

尽管我相信很多人会建议使用带有 width*height 元素的一维数组。

于 2009-03-05T06:12:32.643 回答
1

(几个月后)可以使用模板,如下所示:

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

}
于 2009-08-07T14:29:18.310 回答