gpt4 book ai didi

c++ - parent 的静态变量是否保证在 child 的静态变量之前被初始化?

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:42 27 4
gpt4 key购买 nike

我有一个 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;

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% 确定。

最佳答案

不,不是。按照你的写法,listChild 的静态成员之间没有初始化顺序保证。

保证的是静态数据在其翻译单元中的任何函数的任何使用(即根据单一定义规则)之前被初始化。因此,如果您要使 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++ - parent 的静态变量是否保证在 child 的静态变量之前被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822473/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com