静态成员变量初始化两次
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()
我正在使用我自己的 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()