c++ - 父级的静态变量是否保证在子级的静态变量之前初始化?

标签 c++ initialization static-variables

我有一个 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% 确定。

最佳答案

不,不是。按照您编写的方式,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++ - 父级的静态变量是否保证在子级的静态变量之前初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56822473/

相关文章:

c++ - 单一定义规则是否强制创建单个静态函数变量?

java静态变量序列化

c++ - 在 OpenGL 中创建和混合动态纹理

c++ - 从 Foo** 到 void** 的转换无效 - 为什么允许隐式类型转换为 void* 但不允许为 void**?

C++ 将字符串写入文件 = 额外字节

ios - NSIndexPath:indexPathForRow:inSection 未能正确初始化

c++ - 用于打包数据的标准方法

c - 初始化多个节点时出现段错误

java - 用于基于 map 调用 Java setter 的 Clojure 宏?

java - 静态变量可以用来同步线程吗?