标题可能会有所改善,但是我不确定是什么问题。欢迎提出建议。我有一个自定义的枚举类Color
:
// Color.h
class Color {
protected:
int id;
Color(int id) : id(id) {}
void operator&(); //undefined
public:
Color(const Color& r) : id(r.id) {}
Color& operator=(const Color& r) {id=r.id; return *this;}
bool operator==(const Color& r) const {return id==r.id;}
bool operator!=(const Color& r) const {return id!=r.id;}
operator int() const {return id;} //so you can still switch on it
static Color Blue;
static Color Red;
};
// Color.cpp
#include "Color.h"
Color Color::Blue(0);
Color Color::Red(1);
在中main
,我有一个文件范围的数组Colors
。当我Colors
在文件作用域数组中打印的值时,一切正确:
// main.cpp
#include "Test.h"
using namespace std;
const Color mainColors[] = {Color::Red, Color::Red }; // values should be [1, 1]
int main()
{
cout << "Main file-scoped colors: " << mainColors[0] << ", " << mainColors[1] << endl; // prints [1, 1]
Test();
return 0;
}
但是,如果我尝试在另一个文件中执行相同的操作Test
,则它将不起作用。当我打印文件作用域的数组时,这些值是不正确的,就像它们未初始化一样。
// Test.h
#include "Color.h"
void Test();
// Test.cpp
#include "Test.h"
const Color fooColors[] = {Color::Red, Color::Red}; // values should be [1, 1]
void Test()
{
cout << "Test file-scoped colors: " << fooColors[0] << ", " << fooColors[1] << endl; // prints [0, 0]
}
我在这里做错了什么?我认为这可能与枚举成员是静态的有关,但我不能为此投入精力。
您看到的问题是静态变量初始化顺序不确定的结果。
只需对构建系统进行少量更改即可轻松更改行为(例如,调试与非调试,向程序添加另一个文件等)。
像看上去mainColors
在main.cpp
获取之后,初始化Color::Red
和Color::Blue
初始化,并fooColors
在Test.cpp
获取之前进行初始化Color::Red
和Color::Blue
初始化。
变通(感谢@Andy)
将static
成员函数Blue()
和添加Red()
到Color
。用它们来初始化变量main.cpp
和Test.cpp
在Color.h
:
static Color Blue();
static Color Red();
在Color.cpp
:
Color Color::Blue() {return Color(0);}
Color Color::Red() {return Color(1);}
在main.cpp
:
const Color mainColors[] = {Color::Blue(), Color::Red() };
在Test.cpp
:
const Color fooColors[] = {Color::Blue(), Color::Red()};
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句