-1

我的 Ifndef 不工作。我在两者中都包含两次 MapData.h:Generate.cpp 和 Risky Strats.cpp

地图数据.h:

#ifndef MAPDATA
#define MAPDATA
#include <iostream>
#include <vector>
class bases {
public:
    int x;
    int y;
};

class field {
public:
    std::vector <bases> map;
};
field battleground;
#endif //MAPDATA

生成.cpp:

#include <stdlib.h>//Randomness
#include <time.h>//time
#include <math.h>
#include "MapData.h"

有风险的 Strats.cpp:

#include <SFML/Graphics.hpp>
#include "MapData.h"

我一直收到同样的错误:Generate.obj 中已经定义了类字段战场”(?battleground@@3Vfield@@A)

4

2 回答 2

1

“ifdef 之舞”会阻止您在一个 .cpp 中多次包含相同的 .h。每个 .cpp 文件只包含一次,但将其包含在两个不同的 .cpp 文件中,这意味着这两个 .cpp 文件都具有全局变量battleground

您可以extern在 .h 中声明变量并将定义放入其中一个 .cpp 文件(或 MapData.cpp)中,但我首先要质疑拥有全局变量是否是正确的设计选择。

于 2020-03-30T04:45:15.403 回答
1

这不是包含保护的工作方式——它们防止在单个翻译单元中多次包含同一个头文件,而不是跨多个翻译单元。

正如您现在所拥有的,您的每个翻译单元都有一个名为 的全局对象battleground,然后在链接时发生冲突。

如果实际上您想要一个 global ,则需要在标题field battleground中添加externto ,然后获取定义并将其放入您的文件之一。field battleground;field battleground;.cpp

于 2020-03-30T04:45:19.720 回答