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 (幅、高さ) メソッドが呼び出されたときに、配列にメモリを動的に割り当てる必要があるということです。

次のように2次元を宣言します(整数の配列を想定):

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 に答える
2

新規/削除演算子を調べる時が来たと思います。

これは多次元配列であるため、'new' を呼び出してループする必要があります (忘れないように: delete)。

多くの人が width*height 要素を持つ 1 次元配列を使用することを提案すると確信していますが。

于 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 に答える