Предположим, мне нужно вызвать бесплатный GlobalInitializer (), прежде чем мой конструктор инициализирует какие-либо переменные-члены. Например:
class Foo {
public:
Foo() : bar_()
{
// calling GlobalInitializer() here is too late
}
Bar bar_;
};
Вызов GlobalInitializer () в Foo слишком поздний, потому что мне нужно вызвать его до инициализации bar_. Моя хакерская работа для этого заключалась в создании суперкласса:
class MyInitializer {
protected:
MyInitializer() {
GlobalInitializer();
}
};
class UglyFoo : public MyInitializer
{
public:
UglyFoo() : bar_()
{ }
Bar bar_;
};
UglyFoo выполняет свою работу, но для этого требуется этот уродливый класс MyInitializer. Есть ли более чистый шаблон дизайна или рефакторинг, который даст тот же результат?
Дополнительное примечание : GlobalInitializer () - это дорогостоящий вызов, которого я хочу избежать, если пользователь не создаст экземпляр Foo (). Внутри GlobalInitializer () есть защита от нескольких вызовов. Кроме того, могут быть другие классы, скажем, FooBar, которые также должны вызывать GlobalInitializer (), но в одном процессе GlobalInitializer () будет фактически работать один раз (если создается экземпляр Foo или FooBar) или даже не один раз (если нет экземпляры Foo или FooBar).