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

时间:2016-07-29 21:14:13

标签: c++

我的第一个即时问题是许多奇怪的错误,如下所示:

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

感谢您的协助!

1 个答案:

答案 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,只是为了将相关定义保持在一起。