c++ - 保证全局变量的正确初始化顺序

标签 c++

我已经实现了代表枚举可能性的自定义类,类似于 this article :

// Color.h

class Color {
public:
    static const Color Red;
    static const Color Green;
    static const Color Blue;
    //...
private:
    explicit Color(int code);
    //...

    int code;
    static std::set<Color> colors;
};

// Color.cpp:

const Color Color::Red(1);
const Color Color::Green(2);
const Color Color::Blue(3);    
//...

现在当我想使用 Color 的实例时遇到问题,例如:Color::Red 来初始化另一个翻译单元中的全局变量。我知道这是因为没有定义首先初始化哪个翻译单元全局变量。如何解决初始化排序问题?

我能想到的唯一解决方案是使用 nifty counter。但是我无法找出如何在不影响枚举类语法的情况下使用它。我正在考虑将 set() 方法添加到 Color 中。然后我可以在像初始化器这样的漂亮计数器中调用这个方法:

// Color.h

class Color {
public:
    void set(int code);
    //...
private:
    Color() { /* empty */}
    //...
};

static class ColorInitializer {
    ColorInitializer () {
        static bool initialized = false;
        if(initialized)
            return;

        Color::Red.set(1);
        Color::Green.set(1);
        Color::Blue.set(1);
        initialized = true;
    }
} colorInitializer;

// Color.cpp

const Color Color::Red;
const Color Color::Green;
const Color Color::Blue;

但我在这里看到的问题是 set 方法可以在尚未构造的对象上调用。可以吗还是行为未定义?如何更好的解决未定义初始化顺序的问题?

最佳答案

在 C++11 中(如果你负担得起的话)你可以使用扩展常量表达式功能:

class Color {
public:
    static constexpr const Color Red;
    static constexpr const Color Green;
    static constexpr const Color Blue;
private:
    constexpr explicit Color(int code);
    //...
};

// Color.cpp:

constexpr Color Color::Red(1);
constexpr Color Color::Green(2);
constexpr Color Color::Blue(3);    
//...

关于c++ - 保证全局变量的正确初始化顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11452536/

相关文章:

java - C/C++ 中的 MQ JMS 主题等价物

c++ - 如何编写给定自定义 IDL 的代码生成器?

c++ - C++中重写虚方法

c++ - VS2019 fatal error C1083 : Cannot open compiler intermediate file: xxxx. ipdb: 空间不足

c++ - 使用多线程来模拟这个的好方法是什么?

c++ - 避免在写入文件时覆盖现有文件的内容

c++ - 从应用程序打开控制台

c# - 使用 boost 库在 C++ 中实现多线程的正确方法

C++头文件包含错误

c++ - 如何模仿派生到基指针自动转换?