假设我需要在构造函数初始化任何成员变量之前调用免费的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/

10-11 08:37