我有一个C ++代码,看起来像这样
Parent.hpp
class Parent {
static std::map<std::string, std::function<void()>> list;
}
Parent.cpp
#include "Parent.hpp"
std::map<std::string, std::function<void()>> Parent::list;
Child.hpp
#include "Parent.hpp"
class Child : Parent {
static bool isRegistered = registerComponent();
std::function<void(GameObject* go, void* arr)> add;
static bool registerComponent();
Child.cpp
#include "Child.hpp"
static bool Child::isRegistered = registerComponent();
std::function<void(GameObject* go, void* arr)> Child::add = []() {
//do something
}
static bool Child::registerComponent() {
if (add) {
list["child"] = Child::add;
return true;
}
else return false
}
是否保证在我致电list
之前初始化registerComponent()
?我已经阅读了这篇帖子When are static C++ class members initialized?,我认为不能保证,但是我不确定100%。
答案 0 :(得分:2)
不,不是。按照您编写它的方式,list
和Child
的静态成员之间没有初始化保证的顺序。
所保证的是:静态数据在其转换单元中的任何函数被使用之前(即根据一个定义规则)均已初始化。因此,如果您要使registerComponent
成为Parent
的成员,那么在Parent类及其子类之间一切都会好起来的。
class Parent {
static std::map<std::string, std::function<void()>> list;
protected:
// Implemented in the same TU where list is defined
static bool registerComponent(std::string k, std::function<void()> v);
};
现在,任何调用registerComponent
的子类都将使用定义了list
的转换单元中的函数,因此list
肯定会在执行该函数之前初始化。