我是C ++的新手并且遇到以下问题:
我有一个名为Creature的父类:
class Creature
{
public:
bool isActive;
std::string name;
int attackNumOfDice, attackNumOfSides,
defenseNumOfDice, defenseNumOfSides;
int armor, strength;
Creature();
//two virtual functions determine the damage points
virtual int attack();
virtual int defend();
void halveAttackDice();
void setStrength(int toSet);
void setStatus(bool activity);
};
和5个子类如下:
.h文件:
class Child : public Creature
{
int attack();
int defend();
}
实施档案:
int Child::isActive = true;
std::string Child::name = "";
int Child::attackNumOfDice = 2;
...
int Child::attack()
{
...
}
intChild::defend()
{
...}
然而,当我尝试像这样编译时,我得到所有5个子类的相同错误:
child.cpp:6: error: ‘bool Child::isActive’ is not a static member of ‘class Child’
child.cpp:7: error: ‘std::string Child::name’ is not a static member of ‘class Child’
child.cpp:8: error: ‘int Child::attackNumOfDice’ is not a static member of ‘class Child’
...
我不明白为什么在我从未定义一个静态成员时说不是静态成员?
答案 0 :(得分:1)
您正在尝试访问没有对象上下文的类成员。该错误依赖于您尝试初始化类属性的事实,因为它们是静态的。
这是错误的:
int Child::isActive = true;
std::string Child::name = "";
int Child::attackNumOfDice = 2;
这是错误的,因为当我们谈论非静态属性时,它们必须与对象相关。您为属性提供默认值的方式,您不会将它们与任何对象相关联。
如果要为类属性提供默认值,请在构造函数中执行此操作,更具体地说,使用初始化列表(请查看here)
Child::Child() : Creature(){
...
}
...
Creature::Creature() : isActive(false), name(""){
...
}
每当调用构造函数(或任何非静态类方法)时,都会向其传递一个隐式对象引用(也称为指针this)。这样,使用此对象上下文始终会发生属性访问。