我已经实现了代表枚举可能性的自定义类,类似于 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/