コンストラクターがメンバー変数を初期化する前に、無料のGlobalInitializer()を呼び出す必要があるとします。例えば:
class Foo {
public:
Foo() : bar_()
{
// calling GlobalInitializer() here is too late
}
Bar bar_;
};
FooでGlobalInitializer()を呼び出すのは遅すぎます。これは、bar_が初期化される前に呼び出す必要があるためです。これに対する私のハッキーな回避策は、スーパークラスを作成することでした:
class MyInitializer {
protected:
MyInitializer() {
GlobalInitializer();
}
};
class UglyFoo : public MyInitializer
{
public:
UglyFoo() : bar_()
{ }
Bar bar_;
};
UglyFooは仕事を成し遂げますが、この醜いMyInitializerクラスが必要です。同じ結果を達成する、よりクリーンなデザインパターンまたはリファクタリングはありますか?
追記:GlobalInitializer()は、ユーザーがFoo()をインスタンス化しない限り、避けたい高価な呼び出しです。GlobalInitializer()内には、複数の呼び出しに対するガードがあります。また、GlobalInitializer()を呼び出す必要がある他のクラス(FooBarなど)もありますが、1つのプロセスでは、GlobalInitializer()は実際には1回(FooまたはFooBarがインスタンス化されている場合)または1回も機能しません( FooまたはFooBarのインスタンス化)。