C++:奇怪的多重定义错误和问题
C++: Strange multiple definition errors and problems with
我的第一个直接问题是许多奇怪的错误,看起来像这样:
In function ZN6BeingC2Ev:
multiple definition of 'area'
first defined here
我正在写一个基本的寻路系统,我有两个类:
-区域:区域描述了人类导航穿过的墙壁和开放空间的二维网格。
-Graph:每个能够进行路径查找的对象都有自己的Graph,每个图形对象都需要从当前活动区域获得世界网格布局的一部分。
因此,所有Graph对象都需要知道*area,它在main()中是由通常的area=new area()分配的;
但我不能在main.cpp中声明Area*区域,因为Graphs无法看到它,它的方法也无法读取它
所以我试图在区域.h中声明*区域(如下所示)。我的意图是,因为Graph#包含"area.h",所以Graph#知道area。这导致了我的多重定义问题。
我不确定到底是什么问题,因为我确信我没有在Area自己的头文件之外以任何方式定义它,部分原因是当我单击多重定义源的错误消息时,我的IDE指向了看似无关的函数。
因此,我的第二个问题是:为了避免这样的错误,是否有更好的结构可以让Graph了解Area对象并访问其内容?
以下是我希望能证明我意图的代码,如果遗漏了任何必要的内容,请告诉我。
area.h
#ifndef AREA_H_INCLUDED
#define AREA_H_INCLUDED
class Area
{
std::vector<int>wallmap;
...
} *area;
#endif // AREA_H_INCLUDED
图形.h
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include "area.h"
class Graph
{
...
};
#endif // GRAPH_H_INCLUDED
graph.cpp(问题出在交换机部分)
std::vector<Node*>Graph::RequestPath(int startX, int startY, int destX, int destY);
{
for(std::vector<Node*>::iterator it = nodeGraph.begin(); it != nodeGraph.end(); ++it)
{
(*it)->heuristic = std::abs(destX-startX) + std::abs(destY-startY);
switch(area->wallmap[(*it)->id]) // **I need Graphs to know about the wallmap vector in Area, here for example.**
{
....
}
(*it)->fValue = (*it)->heuristic + (*it)->moveCost;
}
}
main.cpp
#include "area.h"
int main()
{
...
area = new Area();
area->Init();
...
delete area;
...
}
感谢您的帮助!
正如@GManNickG在评论中指出的,问题在于使用area
作为中的变量
class Area
{
std::vector<int>wallmap;
...
} *area;
#include
在.h文件中的每个编译单元都会定义该变量,这导致了链接时的多重定义错误。
我建议使用函数来获取必要的指针,而不是使用全局变量。
class Area
{
std::vector<int>wallmap;
...
};
Area* getArea();
在实现Area
成员函数的.cpp文件中实现它,只是为了将相关定义保存在一起
然后,您可以在使用全局变量的任何位置使用该函数。
如果你必须使用全局变量,我强烈建议你不要使用,你可以使用:
class Area
{
std::vector<int>wallmap;
...
};
extern Area* area;
并确保area
是在实现Area
成员函数的.cpp文件中定义的,只是为了将相关定义放在一起。
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件