繁体   English   中英

静态成员变量初始化两次

[英]static member variable initializing twice

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

//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行会命中,并且变量会重置。

我究竟如何才能确保在未调用REGISTER_OBJECT之前将std :: map初始化,而不将其放置在另一个.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;
}

您可以使工厂变量成为指针(初始化为null),然后让您的REGISTER_OBJECT宏惰性地实例化它,即,将其设置为新的std :: map ...如果为null。

这篇关于(基本上)将单例模式合并到类中的文章阻止了我的静态变量被创建两次( 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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM