我的第一个即时问题是许多奇怪的错误,如下所示:
In function ZN6BeingC2Ev:
multiple definition of 'area'
first defined here
我正在编写一个基本的寻路系统,我有两个类:
-Area:区域描述了生物穿过的墙壁和开放空间的2D网格。
-Graph:每个能够进行寻路的人都有自己的Graph,每个图形对象都需要从当前活动区域获取世界网格布局的一部分。
所以所有Graph对象都需要知道* area,它在main()中由通常的area = new Area()分配;
但是我无法在main.cpp中声明Area *区域,因为Graphs无法看到它,并且它的方法无法读取它。
所以我试着在area.h中声明*区域(如下所示)。我的意图是,因为Graph #includes" area.h",图表将知道该区域。这导致我的多重定义问题。
我不确定究竟是什么问题,因为我确信我没有在其自己的头文件之外以任何方式定义Area,部分原因是当我点击错误消息时我的IDE指向看似无关的函数多重定义的来源。
所以我的第二个问题:为了避免出现这样的错误,是否有更好的结构可以提供Area对象的Graph知识和对其内容的访问?
下面是我希望展示我的意图的代码,如果遗漏任何必要的内容,请告诉我。
area.h
#ifndef AREA_H_INCLUDED
#define AREA_H_INCLUDED
class Area
{
std::vector<int>wallmap;
...
} *area;
#endif // AREA_H_INCLUDED
graph.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;
...
}
感谢您的协助!
答案 0 :(得分:4)
正如@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
成员函数的.cpp文件中定义了Area
,只是为了将相关定义保持在一起。