2

我正在尝试制作一个战锤 40K 军队计数器程序,所以我不必继续使用 excel。我的问题是我的程序出错,因为我有两个不同的对象及其具有相同变量名的头文件。

当我尝试运行我的程序时,g++ 抱怨该变量已在我的第一个对象中声明。

我如何做到这一点,这样就不会发生?

这是 Skulltaker.cpp 程序的代码片段

#include "SkullTaker.h"
#include <string>
int pointCost = 140;
int minSize = 1;
int maxSize = 1;
std::vector<std::string> rules;

这是 SkullTaker.h

class SkullTaker {
public:

    SkullTaker();
    SkullTaker(const SkullTaker& orig);
    int getPointCost();
    int getMinSize();
    int getMaxSize();
    std::vector<std::string> getRules();
    std::string toString();
    virtual ~SkullTaker();
};

我的其他类是相同的,但在 KuGath 中的 .cpp 和 .h 文件的名称。

g++ 抱怨 PointCost 有多种定义。

谢谢,

多纳

4

4 回答 4

3

使用“static”关键字来表示你的全局变量的范围应该仅限于它的翻译单元。

static int pointCost = 140;

于 2012-08-16T22:29:55.780 回答
2

使用“匿名”命名空间:

namespace {
int pointCost = 140;
int minSize = 1;
int maxSize = 1;
std::vector<std::string> rules;
}
//the code that uses these comes here.

其中的所有内容都只会在该文件中可见。另一种选择 - 如果您只需要类定义的那些 - 将这些作为类的静态私有成员包括在内。

class Skulltaker {
    public:
    ...
    private: /* I believe this initialization syntax is allowed in C++11
                otherwise, initialize them in your .cpp file
                like this: int Skulltaker::pointCost(140);*/
    static int pointCost = 140;
    static int minSize = 1;
    static int maxSize = 1;
    static std::vector<std::string> rules;
};

好吧,但是这样想——现在你有一个第一手的经验,为什么人们一直告诉你尽可能不要使用全局变量(除了设计问题)。

于 2012-08-16T22:38:51.857 回答
2

您正在使您的 pointcost 全局化,并且不属于命名空间。您可以使其成为您的类的成员(私有:int pointcost;),然后在构造函数中的 cpp 或任何设置的 pointcost=140 中。由于这实际上看起来每个类都可以派生自一个名为“WarHammerUnit”的基类,因此它可能是那里的成员,您可以在构造函数中为每个单元设置它。

于 2012-08-16T22:47:09.380 回答
0

如果那是完整文件,则using namespace std;在包含之后需要一个命令。鉴于您有一个可能会解决它的命名空间问题...如果您的所有编译器指令都很好(包括、ifdefs 等),那么您的类中的变量名之间应该没有冲突。

此外,类属性应该在头文件中声明,看起来你把这两个混淆了(或者这只是写问题的一个错误)。如果这些值应该是常量,则可以static const在头文件中声明它们并在那里初始化它们,如果它们因实例而异,则应在构造函数中初始化它们。

于 2012-08-16T22:25:27.533 回答