parent的静态变量是否保证在child的静态变量之前被初始化?
Is parent's static variables guaranteed to be initialized before child's static variables?
我的 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()
之前被初始化?我读过这个 post When are static C++ class members initialized? 我认为不能保证,但我不是 100% 确定。
不,不是。按照你写的方式,list
和 Child
的静态成员之间没有初始化顺序保证。
是保证的是静态数据在其翻译单元中的任何函数的任何使用(根据一个定义规则,即)之前被初始化。因此,如果您要让 registerComponent
成为 Parent
的成员,父 class 及其子项之间的一切都会好起来的。
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
的子 class 都将使用定义 list
的翻译单元中的函数,因此 list
肯定会在函数被初始化之前初始化已执行。
我的 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()
之前被初始化?我读过这个 post When are static C++ class members initialized? 我认为不能保证,但我不是 100% 确定。
不,不是。按照你写的方式,list
和 Child
的静态成员之间没有初始化顺序保证。
是保证的是静态数据在其翻译单元中的任何函数的任何使用(根据一个定义规则,即)之前被初始化。因此,如果您要让 registerComponent
成为 Parent
的成员,父 class 及其子项之间的一切都会好起来的。
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
的子 class 都将使用定义 list
的翻译单元中的函数,因此 list
肯定会在函数被初始化之前初始化已执行。