配列を as として宣言するとtest arr[9][9];
、メモリが割り当てられ、メンバーごとにデフォルトのコンストラクターが呼び出されます。new
したがって、新しいメモリを割り当てるために呼び出す必要はありません。あなたの目標は、test
から読み取った値で構築されたオブジェクトの配列を持つことだと思いますstd::cin
。
次に、いくつかのオプションがあります。
- 最も簡単な解決策は、ポインターの 2D 配列を使用することです。
次のようになります。
test* arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
for(unsigned int j = 0; j < 9; j++)
{
cin >> s[i][j];
arr[i][j] = new test(s[i][j]);
}
}
- プレーン オブジェクトの配列を (ポインターなしで) 保持したい場合は
test
、次のいずれかを使用できます。
test::set(int)
構築後に値を設定するメソッドを提供します。
test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
for(unsigned int j = 0; j < 9; j++)
{
cin >> s[i][j];
arr[i][j].set(s[i][j]);
}
}
operator=(const test&)
一時的にオブジェクトを構築し、それを使用して(またはoperator=(test &&)
c ++ 11で)配列内のすでに割り当てられているオブジェクトに割り当てます。ここにはないことに注意してnew
ください:
test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
for(unsigned int j = 0; j < 9; j++)
{
cin >> s[i][j];
arr[i][j] = test(s[i][j]);
}
}
または、placement new を使用します (これにより、事前に割り当てられたメモリ ブロックに新しいオブジェクトが構築されます)。
test arr[9][9];
for(unsigned int i = 0; i < 9; i++)
{
for(unsigned int j = 0; j < 9; j++)
{
cin >> s[i][j];
new(&arr[i][j]) test(s[i][j]);
}
}
- そして最後の 1 つ: 静的な 2D 配列を使用する特別な理由がない場合は、STL コンテナーを使用してください。