[英]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.