全局指针“已定义为”错误

时间:2012-06-17 05:30:11

标签: c++

我正在编写一个小型的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个文件

sceneManger.h:

// Our global scene manger variable

scnManger* sceneManger;

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

scnManger shaderViewerScnManger; 
sceneManger = &shaderViewerScnManger;

sceneManger.cpp(包括sceneManger.h):

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

首先,我想了解为什么我会收到错误,并且对任何有关更好的处理方法的建议也持开放态度。我不确定使用像这样的全局变量是不是一个好主意。

1 个答案:

答案 0 :(得分:6)

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

extern scnManger* sceneManger;

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

scnManger* sceneManger;

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