3

所以在我的命名空间的 .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();

第一个 display() 从 LoadIdentity() 函数中将单位矩阵打印到屏幕上,但第二个在函数返回后显示全零。为什么我的价值观会消失?我应该以不同的方式使我的全球化吗?谢谢

4

3 回答 3

5

您已static Matrix m;在头文件中声明。这意味着每个包含该标头的 .cpp 文件都将获得自己的 .cpp 版本m

相反,您需要将其设为全局(尽管是命名空间范围的)变量。

在头文件中:

namespace wtvr{
extern Matrix m;
};

在任何 .cpp 文件中:

namespace wtvr{
Matrix m;
};
于 2013-10-02T11:44:06.600 回答
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
}

}
于 2013-10-02T11:43:37.317 回答
1

是的,你应该以不同的方式让你的全球化。

在 .h 文件中:

extern Matrix m;

在其 .cpp 文件中:

Matrix m;
void LoadIdentity(void)
{
    m = Identity();
    m.display();
}

无需更改其他文件。static在文件范围内意味着每个文件都有自己的变量副本,该副本不与其他文件的变量副本链接,这与您想要的相反。

于 2013-10-02T11:45:23.733 回答