C++:奇怪的多重定义错误和问题

C++: Strange multiple definition errors and problems with

本文关键字:定义 错误 问题 C++      更新时间:2023-10-16

我的第一个直接问题是许多奇怪的错误,看起来像这样:

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文件中定义的,只是为了将相关定义放在一起。