假设我需要在构造函数初始化任何成员变量之前调用免费的GlobalInitializer()。例如:
class Foo {
public:
Foo() : bar_()
{
// calling GlobalInitializer() here is too late
}
Bar bar_;
};
在Foo中调用GlobalInitializer()为时已晚,因为我需要在bar_初始化之前对其进行调用。为此,我的棘手工作是创建一个父类(super class):
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的实例化)。
最佳答案
class Foo {
private:
struct Initializer {
Initializer() { GlobalInitializer(); }
};
Initializer initializer__; // declare before bar__ to ensure it is constructed first
public:
Foo() : bar_()
{
}
Bar bar_;
};
关于c++ - C++重构:构造函数中的初始化顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7835138/