C ++のクラス定義で配列サイズを遅らせていますか?
質問
クラスメソッドまたはコンストラクターまで配列のサイズの定義を遅らせる方法はありますか?
私が考えていることは、このように見えるかもしれませんが、(もちろん)動作しません:
class Test
{
private:
int _array[][];
public:
Test::Test(int width, int height);
};
Test::Test(int width, int height)
{
_array[width][height];
}
解決
ダニエルが言っているのは、Test(width、height)メソッドが呼び出されたときに、配列にメモリを動的に割り当てる必要があるということです。
次のように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;
他のヒント
ベクターはあなたの親友です
class Test
{
private:
vector<vector<int> > _array;
public:
Test(int width, int height) :
_array(width,vector<int>(height,0))
{
}
};
new / delete演算子を調べる時が来たと思います。
これは多次元配列であるため、「new」を呼び出すときにループする必要があります(忘れずに:削除)。
多くの人が、width * height要素を持つ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];
}
所属していません StackOverflow