我正在尝试制作一个战锤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有多种定义。
谢谢,
dhoehna
答案 0 :(得分:3)
使用“static”关键字表示您的全局变量的范围应仅限于它的翻译单元。
static int pointCost = 140;
答案 1 :(得分:2)
使用'anonymous'命名空间:
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;
};
好吧,但是考虑一下 - 现在你有了第一手的经验,为什么人们一直告诉你,如果可能的话,不要使用全局变量(除了设计问题)。
答案 2 :(得分:2)
您正在使您的pointcost成为全局,而不属于命名空间。您可以使它成为您的类的成员(private:int pointcost;),然后在构造函数中的cpp或任何set pointcost = 140中。 因为这实际上看起来每个类都可以从名为“WarHammerUnit”的基类派生,所以它可以是那里的成员,而是为构造函数中的每个单元设置它。
答案 3 :(得分:0)
如果这是完整文件,则在包含后需要using namespace std;
命令。鉴于你有一个可能修复它的名称空间问题......如果你的所有编译器指令都很好(include,ifdefs,ect),你的类中的变量名之间应该没有冲突。
同样应该在头文件中声明类属性,看起来你把这两个混淆了(或者写这个问题可能只是一个错误)。如果这些值应该是常量,你可以在头文件中将它们声明为static const
并在那里初始化它们,如果它们在实例之间不同,你应该在构造函数中初始化它们。