#動機
クラスの初期化を利用側に依存しない形で記述する。
#意図
クラス変数の設定などクラスを初期化する必要がある。単純なクラス変数の代入程度ならば直接に初期化式として書ける。
class Foo {
static double static_variable;
};
double Foo::static_variable = 1.0;
このように単一の式では書くのが困難な程度に複雑な処理が必要な場合では、専用の初期化メソッドとして書き表したい。だが利用者にそれを呼んでもらうことにするのは嫌だ。上記の例のように、クラス提供側だけで解決されるようにしたい。
要するに Java の 静的初期化子(static initializer)のように書きたいのだが。
#解法
初期化をコンストラクタで行うクラスを用意し、そのインスタンスを静的変数として定義する。
class Foo {
public:
static void Initialize() {
puts("initialize something");
}
};
class Initializer {
public:
Initializer() {
Foo::Initialize();
}
};
Initializer instance; // 静的な変数として実体化する
#バリエーション
初期化クラスにデストラクタを定義すれば、終了処理を書くことも出来る。
初期化クラスを対象クラスの入れ子として定義することもできる。
異なるアプローチとして、あらかじめ初期化しておくのではなく、初回使用時に初期化するというスタイルも考えられる。初回使用時生成(Construct On First Use)を参照。
#関連
この手法はメンバ変数初期化のパターンではなく、RII イデオムを静的なデータに適用したものとみなせる。(RAII: "リソース獲得は初期化である(Resource Acquisition Is Initialization)")
#メモ
ふと「C++ static initializer」で検索したら http://okwave.jp/qa/q5788226.html がトップに出てきて、そこに確かに解は書いてあるのだけど、この質問をしている人には分かりにくいだろうなぁと思ったので書いてみた。