std::vector
動的に割り当てられた配列の代わりに a を使用することをお勧めします。std::vector
s は操作がはるかに簡単で、メモリ リークもありません。
ただし、エラー メッセージが参照する欠落しているコンストラクターはSquare
のコンストラクターです。Square
引数を取らない コンストラクタを追加する必要があります。次のいずれかを行います。
class Square {
Square() { ... }
// Square with dimensions of 0 is empty
Square(int length=0, int width=0) { ... }
...
};
これらの両方をファイルに入れると、引数が指定されていないときにどのコンストラクターを呼び出すかを知ることができないため、エラーが発生することに注意してください。
を使用する場合でも、おそらくデフォルトのコンストラクターが必要になるでしょうstd::vector
。std::vector
「おそらく」オブジェクトを受け取る のコンストラクターに限定すると、回避できるためです。たとえば、次のようになります。
std::vector<Square> foo(10, Square(0, 0));
// reassign each element accordingly
これは、質問自体へのコメントとして既に追加しています。Herb Sutter が言うように、std::vector
はarray と交換できるように設計されています。
ベクトルが連続していることがなぜそれほど重要なのですか? これは、ベクトルが C 配列とレイアウト互換であることを保証する必要があるためです。したがって、C コードとデータを交換する必要がある場合でも、配列に代わる優れた型安全な代替手段としてベクトルを使用しない理由はありません。そのため、Vector は他の言語やほとんどのオペレーティング システム機能へのゲートウェイであり、そのリンガ フランカは由緒ある C 配列です。
ちなみに、構文は (Assuming v
is a vector)&v[0]
です。つまり、最初の要素のアドレスを取得し (これは参照であるため、 をstd::vector
除くすべての sstd::vector<bool>
で機能します)、ポインターを期待する任意の関数に渡すことができるポインターを取得します (もちろん、として「配列」の長さを取得しますv.size()
)。