2

我正在编写一个小的 DirectX 模型查看器。

我刚刚写完我的场景管理器。

我将永远只有 1 个场景管理器对象,所以我的想法是创建一个“scnManger”类型的全局指针,然后在创建场景管理器对象时设置它。

这将使我可以从我的应用程序的任何地方访问它。

我收到了一个编译错误:

1>shaderViewer.obj : error LNK2005: "class scnManger * sceneManger" (?sceneManger@@3PAVscnManger@@A) already defined in sceneManager.obj
1>C:\Users\Greg\Documents\Visual Studio 2010\Projects\ShaderViewer\Debug\ShaderViewer.exe : fatal error LNK1169: one or more multiply defined symbols found

现在我有 3 个文件

场景管理器.h:

// Our global scene manger variable

scnManger* sceneManger;

shadherViewer.cpp (winMain & 包括 sceneManger.h):

scnManger shaderViewerScnManger; 
sceneManger = &shaderViewerScnManger;

场景管理器.cpp(包括场景管理器.h):

我在这里使用我的场景管理器对象的方法来处理各种事情。

首先,我想了解我收到错误的原因,并且也愿意接受有关更好的处理方法的任何建议。我不确定使用这样的全局变量是否是个好主意。

4

1 回答 1

6

您不应在 .h 文件中定义全局变量。您应该在 .h 中声明它们,如下所示:

extern scnManger* sceneManger;

然后在一个cpp 文件中定义它们,如下所示:

scnManger* sceneManger;

否则,每个包含 .h 文件的 cpp 文件都将声明该sceneManger变量,从而导致名称冲突。

于 2012-06-17T05:32:18.073 回答