所以在我的命名空间的.h文件中,我有
namespace wtvr{
static Matrix m;
void LoadIdentity(void);
};
在.cpp文件中,我有
namespace wtvr{
void LoadIdentity(void){
m = Identity();
m.display();// trace for debugging
}
};
否则主程序中的位置
wtvr::LoadIdentity();
wtvr::m.display();
第一个显示()从LoadIdentity()函数中将标识矩阵打印到屏幕,但是第二个(在函数返回后)显示全零。 为什么我的价值观消失了? 有没有不同的方式我应该做我的全球? 感谢
答案 0 :(得分:5)
您已在头文件中声明static Matrix m;
。这意味着包含该标头的每个.cpp文件将获得其自己的m
版本。
而是你需要使它成为一个全局(虽然命名空间范围)变量。
在头文件中:
namespace wtvr{
extern Matrix m;
};
在任何.cpp文件中:
namespace wtvr{
Matrix m;
};
答案 1 :(得分:2)
您已将变量声明为static
,这意味着每个翻译单元(.cpp文件)都有自己的副本。你可能意味着这个:
.h文件:
namespace wtvr{
extern Matrix m; //declare for use from everywhere
void LoadIdentity(void);
}
.cpp文件:
namespace wtvr{
Matrix m; //define in exactly one .cpp file
void LoadIdentity(void)
{
m = Identity();
m.display();// trace for debugging
}
}
答案 2 :(得分:1)
是的,你应该采用不同的方式来实现全球化。
在.h文件中:
extern Matrix m;
在.cpp文件中:
Matrix m;
void LoadIdentity(void)
{
m = Identity();
m.display();
}
没有其他文件需要更改。文件范围中的static
表示每个文件都有自己的变量副本,该变量没有与其他文件的变量副本链接,这与您想要的相反。