value不会被赋值给类中的变量

时间:2018-01-04 18:48:07

标签: c++

我一直尝试使用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

2 个答案:

答案 0 :(得分:0)

问题是您要分配给weaponAttack而不是初始化它。如果您在构造函数的mem-initialiser列表中对其进行初始化,那么x的类内初始化程序(已声明并且此单元格比weaponAttack更晚)将使用它:

weapon(string n, string desc, int p, float attack) : item(n, desc, p), weaponAttack(attack) {};

[Live example]

这只是为什么你应该总是使用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;
};