ぷろみん

プログラミング的な内容を扱ってます

Initを作らないで

モチベーション

Initとかの関数作る人多いので、無い方が良いって事を伝えたいです。

Initが駄目な理由

一番の理由は標準機能では無いからです。
Initがあるクラスもあれば、無いクラスもある。InitじゃなくてConstructかもしれないし、Startかもしれないし、SetupかもしれないしInitializeかもしれない。
プログラマーはそのクラスを使う為にヘッダや初期化規約を読まなければいけません。初期化規約が無いのなら予想にまかせて適当に関数を叩くか、内部コードまで読まなければいけません。カプセル化って何だっけ状態です。

コンストラクタという明確な分かりやすい初期化メソッドがあるので、その役割とInitの役割が被っているのもInitを持たない方が良い理由です。

次に、初期化されているか確認する方法が必要になります。それはIsInitializedかもしれないし、Ready関数かもしれないですし、EnableClassかもしれません。良い選択肢としてoperator boolがありますが、こちらは有効だった場合アロー演算子アクセスが許されるという考え方が一般的なのでそれに従いましょう。

クラスは常に有効にする。有効にできない場合がある時は有効じゃないメソッドをアロー演算子の向こうに置く。という考え方が重要です。

Initが駄目なら何を使えば良いのか

std::shared_ptrかstd::experimental::optionalでしょう。
C++17にはstd::optionalになっていると良いのですが。

好きなタイミングで有効にして、好きなタイミングで開放できるので役割としても十分です。 全部が初期化されるのが嫌だって言うのなら、その関数にはもっと良い名前があるはずです。しっかりと考えて付けてあげましょう。