コピー禁止クラスと右辺値参照
balor では多くのクラスでコピーが禁止されています。
Control クラスはコピー禁止なのでその派生クラスである Button クラスもコピー禁止です。
Button b0, b1;
b0 = b1; // コンパイルエラー!コピーは禁止されている。
これまでコピー禁止クラスといえば
- STL コンテナに格納できない。
- 関数の戻り値にできない。
- 任意のタイミングで初期化できない。
このような不便があったため、コピー禁止クラスは new 演算子でヒープメモリに割り当てて
スマートポインタで管理するのが定石でした。
しかし Visual C++ 2010 で右辺値参照がサポートされた事で
ムーブセマンティクスを実装できるようになり、上記の問題は解決されました。
std::vector<Button> buttons; buttons.push_back(Button()); // STL コンテナに格納できる。 Button button = getMyButton(); // 関数の戻り値にできる。 button = Button(frame, 0, 0, 0, 0, L"button"); // 任意のタイミングで初期化できる。
具体的には右辺値参照コンストラクタと右辺値参照代入演算子で
ムーブセマンティクスを実装しています。
このため、balor ライブラリではクラスに対してメモリ割り当てを強制しません。
もちろん、ポリモフィズムやリファレンスカウントが必要な場合はこれまで通り
ヒープメモリに割り当てしてスマートポインタで管理することも可能です。