gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:49:40 24 4
gpt4 key购买 nike

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

In function ZN6BeingC2Ev:
multiple definition of 'area'
first defined here

我正在编写一个基本的寻路系统,我有两个类:

-Area:区域描述了墙壁和开放空间的二维网格,人们可以通过这些网格。

-Graph:每个具有寻路能力的生物都有自己的Graph,并且每个这些Graph对象都需要从当前事件的Area中获取世界网格布局的一部分。

所以所有的Graph对象都需要知道*area,在main()中通过通常的area = new Area()分配;

但我无法在 main.cpp 中声明 Area *area,因为 Graphs 无法看到它,并且它的方法也无法读取它。

所以我尝试在 area.h 中声明 *area(如下所示)。我的意图是因为 Graph #includes “area.h”,所以 area 对 Graph 是已知的。这导致我的多重定义问题。

我不确定到底是什么问题,因为我确定我没有以任何方式在它自己的头文件之外定义 Area,部分原因是当我单击多重定义的来源。

那么我的第二个问题:为了避免此类错误,是否有更好的结构可以让 Graph 了解 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(问题出在switch部分)

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;
}
}

主要.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成员函数的.cpp文件中定义了area,只是为了将相关定义放在一起。

关于C++:奇怪的多重定义错误和问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38667587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com