std::vector に入れる独自クラスにはデフォルトコンストラクタが必要
std::vector に独自クラスを入れる場合、デフォルトコンストラクタとコピーコンストラクタが必要不可欠だ。
#include <iostream> #include <vector> class Foo { public: int i; Foo() : i(0) { std::cout << "default" << std::endl; } Foo(int num) : i(num) { std::cout << "int param" << std::endl; } Foo(const Foo &rhs) : i(rhs.i) { std::cout << "copy const" << std::endl; } ~Foo() { std::cout << "destructer" << std::endl; } }; int main(int argc, char *argv[]) { std::vector<Foo> v; v.push_back(Foo(1)); v.resize(2); return 0; }
上記のコードの出力はこんな感じ。
int param copy const destructer default copy const copy const copy const copy const destructer destructer destructer destructer destructer destructer
resize した際に、コピーコンストラクタが想定以上に呼び出されるのは何なんだろう。vector 内でコピーが繰り返されて、メモリ位置が調整されてるのかな。
ちなみに、デフォルトコンストラクタを用意しなければならないという制約のせいで、メンバ変数を const にすることができないので、設計に支障がでてしまう。こういう場合、どういう風に設計したらいいんだろう。