Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;_C++_Object - Fatal编程技术网

C++ 如何在C++;

C++ 如何在C++;,c++,object,C++,Object,我正在尝试制作一个战锤40K陆军对抗程序,这样我就不必继续使用excel。我的问题是,我的程序出错,因为我有两个不同的对象,它们的头文件具有相同的变量名 当我试图运行我的程序时,g++抱怨变量已经在我的第一个对象中声明 我怎样才能避免这种情况发生 下面是SKulltaker.cpp程序的代码片段 #include "SkullTaker.h" #include <string> int pointCost = 140; int minSize = 1; int maxSize = 1

我正在尝试制作一个战锤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”
#包括
int pointCost=140;
int minSize=1;
int maxSize=1;
向量规则;
这是盗墓者

class SkullTaker {
public:

    SkullTaker();
    SkullTaker(const SkullTaker& orig);
    int getPointCost();
    int getMinSize();
    int getMaxSize();
    std::vector<std::string> getRules();
    std::string toString();
    virtual ~SkullTaker();
};
职业窃贼{
公众:
盗贼();
骷髅人(const SkullTaker&orig);
int getPointCost();
int getMinSize();
int getMaxSize();
std::vector getRules();
std::string toString();
虚拟~SkullTaker();
};
我的另一个类是相同的,但是KuGath中.cpp和.h文件的名称是相同的

g++抱怨PointCost有多个定义

谢谢


dhoehna

如果这是完整文件,则需要使用命名空间std的
包含后的命令。鉴于您有一个名称空间问题,可能会解决它。。。如果所有编译器指令都正常(includes、ifdef、etc),那么类中的变量名之间应该不会有冲突

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

使用“static”关键字,指示全局变量的范围应仅限于其转换单位


static int pointCost=140

使用“匿名”命名空间:

namespace {
int pointCost = 140;
int minSize = 1;
int maxSize = 1;
std::vector<std::string> rules;
}
//the code that uses these comes here.
名称空间{
int pointCost=140;
int minSize=1;
int maxSize=1;
向量规则;
}
//这里是使用这些的代码。
其中的所有内容将仅在该文件中可见。另一种选择——如果您只需要这些用于类定义——是将它们作为类的静态私有成员包括在内

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;
};
职业窃贼{
公众:
...
private:/*我相信这种初始化语法在C++11中是允许的
否则,在.cpp文件中初始化它们
如下所示:int Skulltaker::pointCost(140)*/
静态int pointCost=140;
静态int minSize=1;
静态int maxSize=1;
静态std::向量规则;
};

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

你是在使你的pointcost全局化,而不属于名称空间。您可以使它成为类的成员(private:int pointcost;),然后在构造函数的cpp中或任何设置pointcost=140的值中。
因为这实际上是一个看起来每个类都可以从一个叫做“WarHammerUnit”的基类派生出来的东西,所以它可以是那里的一个成员,你可以在构造函数中为每个单元设置它。

你的头文件中有吗?这很有效。非常感谢你。当我不太累的时候,我会查找static关键字,看看它能做什么。