我有一个 C++ 代码,如下所示
父级.hpp
class Parent {
static std::map<std::string, std::function<void()>> list;
}
父级.cpp
#include "Parent.hpp"
std::map<std::string, std::function<void()>> Parent::list;
子.hpp
#include "Parent.hpp"
class Child : Parent {
static bool isRegistered = registerComponent();
std::function<void(GameObject* go, void* arr)> add;
static bool registerComponent();
子.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
}
在调用 registerComponent()
之前,list
是否能保证初始化?我读过这篇文章When are static C++ class members initialized?我认为这不能保证,但我也不是 100% 确定。
最佳答案
不,不是。按照您编写的方式,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
肯定会在之前初始化该函数被执行。
关于c++ - 父级的静态变量是否保证在子级的静态变量之前初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822473/