msty開発メモ

技術ネタを綴ります

【C++】プライベートなコンストラクタを持つクラスをmake_uniqueする方法

クラス外ではインスタンス化されちゃあ困るけど、クラス内でインスタンス化したいとき。
普通にnew XXXってするとうまくいくんだけど、C++だとスマートポインタに置き換えたいよねってことで、std::make_uniqueとか使うよね。
つまりこう書きたい


エラーになる。ちなみにnew Aだと動く。
make_uniqueだと、一度クラスの外でnewでインスタンスを生成しているのが原因。
クラス外で一時的にnewによるインスタンス生成を認めるには継承を使って、非公開なコンストラクタにアクセスする。
GetInstanceメソッドを以下のように修正。


一時的に宣言した構造体(クラスでもおk)はローカルスコープ内に隠しているので問題なし。
確実に隠蔽するなら、GetInstanceメソッドの定義をヘッダではなくソースファイル側に書き、コンパイラにインライン展開を任せるといい感じにカプセル化できる。
ヘッダに定義があったらそれイジって生成し放題だからね。