Data* arr = new Data[len];
うまくいかない最も可能性の高い理由の 1 つは、 typeData
にデフォルトのコンストラクタがないためですData::Data()
。
しかしData
、デフォルトのコンストラクターがあるかどうかに関係なく、とにかくこのような配列を作成しようとするのは得策ではありません。動的に割り当てたら、new[]
それに接続する醜いメモリ管理を処理することを約束します。std::vector
(必須)などの STL コンテナーの 1 つを使用して#include <vector>
、メモリ管理を処理することをお勧めします。
次に、いくつかのオプションがあります。
std::vector<Data> v; // option 1
v.reserve(len);
// in loop:
v.push_back(Data(x, y)); // there could be different values
std::vector<Data> v2(len); // option 2
std::vector<Data> v3(len, Data(12,12)); // option 3
最初のオプションは、ほぼすべての状況に適合します。要素を保持するのに十分な大きさのメモリのチャンクを準備し、便利でありながら非常に効率的な方法でlen
埋めることができます。v
オプション 2Data
にはデフォルトのコンストラクターが必要です。これは、カスタム コンストラクターを使用して要素を構築するオプション 3 によって解決されます。
上記のすべてのオプションにより、std::vector
自動保存期間が作成されるオブジェクトが生成されます。すべての要素はメモリの連続ブロックに格納されるため、 を使用&v[0]
して最初の要素へのポインタを初期化し、動的に割り当てられた配列を操作するのと同じ方法で操作できます。