如何在C ++中的两个不同对象中使用相同的变量名

时间:2012-08-16 22:20:52

标签: c++ object

我正在尝试制作一个战锤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

4 个答案:

答案 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并在那里初始化它们,如果它们在实例之间不同,你应该在构造函数中初始化它们。