父级的静态变量是否一定要在子级的静态变量之前初始化?

时间:2019-06-30 04:50:10

标签: c++ initialization 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()?我已经阅读了这篇帖子When are static C++ class members initialized?,我认为不能保证,但是我不确定100%。

1 个答案:

答案 0 :(得分:2)

不,不是。按照您编写它的方式,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肯定会在执行该函数之前初始化。