静态成员变量初始化两次

static member variable initializing twice

我正在使用我自己的 REGISTER_OBJECT() 宏来创建一个充满 类 的工厂。 它按预期工作,除了我的静态 std::map 变量的初始化。如果我不在 .cpp 文件中初始化静态 std::map,我当然会得到一个未解析的外部符号。但问题是,我必须在 运行 时间首先调用的 .cpp 文件中进行初始化。否则,REGISTER_OBJECT() 将在 std::map 初始化程序之前被调用。

//std::map MUST be initialized in the .cpp file the compiler calls first.

    std::map<std::string, MyFactory*> Factory::factories; //global init
    REGISTER_OBJECT(MyClass);

如果我将 std::map 初始化程序放在我喜欢的 .cpp 文件中,REGISTER_OBJECT 将被调用几次,std::map 将相应地填充,但是随后std::map 行命中并且变量被重置。

我究竟如何确保 std::map 在调用 REGISTER_OBJECT 之前被初始化,而不将其放入另一个 .cpp 文件中。谢谢:)

解决方案

//Factory.cpp
std::map<std::string, MyFactory*>* Factory::factories = NULL;

void Factory::Register(const std::string& name, MyFactory* _class)
{
    if(!factories){ factories = new std::map<std::string, MyFactory*>(); }
    (*factories)[name] = _class;
}

你可以让你的工厂变量成为一个指针(初始化为空),然后让你的 REGISTER_OBJECT 宏懒惰地实例化它,即将它设置为新的 std::map... 如果它是空的.

这篇关于(本质上)将单例模式合并到 class 中的文章防止我的静态变量被创建两次 (https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use-members)

基本要点是替换

class MyClass {
  // static member gets initialized twice
  static inline int someNumber = randomInt(); 
}

...与...

class MyClass {
  // singleton like pattern keeps someNumber from being initialized more than once
  static inline int& someNumber() {
    static int* singletonHack = randomInt();
    return &singletonHack;
  }
}

然后这样访问MyClass::someNumber()