我一直尝试使用weaponAttack
作为float x
的公开值来阅读readItem
,但x
读取为0
包含类
的标头中的一些代码 class item
{
private:
string name;
string description;
int price;
public:
void readItem(float x);
item(string n, string desc, int p);
};
class weapon : public item
{
private:
float weaponAttack;
public:
weapon(string n, string desc, int p, float attack) : item(n, desc, p) { weaponAttack = attack; };
float x = weaponAttack;
};
source.cpp包含类
的值weapon Weapon("Sword", "Description", 200, 10.0f); // 10.f does not get assigned to x
Weapon.readItem(Weapon.x);//used to check if values are correct
答案 0 :(得分:0)
问题是您要分配给weaponAttack
而不是初始化它。如果您在构造函数的mem-initialiser列表中对其进行初始化,那么x
的类内初始化程序(已声明并且此单元格比weaponAttack
更晚)将使用它:
weapon(string n, string desc, int p, float attack) : item(n, desc, p), weaponAttack(attack) {};
这只是为什么你应该总是使用mem-initialiser列表而不是在构造函数体中进行赋值的几个原因之一。
答案 1 :(得分:0)
类范围内的分配意味着您要使用该值初始化变量。因此,编译器将此设置为在对象构造期间完成。因此,当您构建武器对象时, x 在 weaponAttack 之前使用 weaponAttack 进行初始化(已经初始化为no) value)被赋予 attack 的值。正确的方法是在构造函数的范围内将 weaponAttack 的值赋给 x ,或者更好的方法是初始化变量 x < / em>在构造函数中,在初始化 weaponAttack 之后。
如果您希望 x 和 weaponAttack 始终具有相同的值而不会损害 weaponAttack 的封装,则应使用 x 作为它的常量引用。这将允许您公开访问 x ,但其值仅在 weaponAttack 被私下修改时才会更改。
所以最终的结果应该是:
class weapon: public item
{
private:
float weaponAttack;
public:
weapon(string n, string desc, int p, float attack):
item(n, desc, p), weaponAttack(attack), x(weaponAttack)
{}
float const & x;
};