类函数不改变成员变量

时间:2015-09-15 01:26:25

标签: c++

我是C ++的初学者,昨天我用OO(面向对象)迈出了第一步。 我制作了一个具有角色类(Personnage)的程序,我为角色制作了三个变量,vie,mana和degat。 我在类中也做了一个攻击的功能,它应该从john中移除健康,但是当我用另一个功能显示约翰的健康时我看到100,有人可以帮我吗?

#include <iostream>
#include <string>

using namespace std;
       class Personnage
    {
    public:
    void montrer()
    {
        cout << vie << endl;
    }
    void attaquer(Personnage john)
    {   
        vie = vie - degat;
        if (vie < 0)
        {
            vie = 0;
        }
    }
    private:
    int degat = 50;
    int vie = 100;
    int mana = 100;
    };
       int main
        {
        int action(0), degat;
        Personnage jack, john;
        cout << "What action do you want to do ?" << endl;
        cout << "1-Attack your ennemy." << endl;
        cout << "2-Take some life" << endl;
        cout << "3-Take some mana." << endl;
        cin >> action;
        switch(action)
        case '1':
        jack.attaquer(john);
        john.montrer();

        return 0;
        }

2 个答案:

答案 0 :(得分:1)

首先,您必须执行“case 1”而不是“case'1'”,因为您的变量是整数。但是,这不会解决你的问题,你仍然会看到john的状态不受方法“attaquer”调用的影响。为什么?因为方法是在人物杰克而不是约翰身上调用。如果你想让方法改变受攻击的Paersonnage的健康状况,而不是攻击的Paersonnage,你应该这样做:

 void attaquer(Personnage& victime) // notice the &, pass by reference
    {   
        victime.vie -= degat;
        if (victime.vie < 0)
        {
            victime.vie = 0;
        }
    }

答案 1 :(得分:0)

void attaquer(Personnage john)
{   
    vie = vie - degat;
    if (vie < 0)
    {
        vie = 0;
    }
}

viedegat都指向调用方法的对象的字段。您从attaquer致电jack,以便jack的数据发生变化。然后,您拨打john.montrer(),这会显示john未经过修饰的数据。

我认为您希望attaquer影响传递给它的Personnage。要更改传递的参数:

void attaquer(Personnage john)
{   
    john.vie = john.vie - degat;
    if (john.vie < 0)
    {
        john.vie = 0;
    }
}

您必须指定要使用不同的对象的数据。但是,这不是一个完整的解决方案,因为void attaquer(Personnage john)的值为Personnage。这意味着它会复制您提供的对象,并且该新副本会在函数末尾消失。将其作为参考:

void attaquer(Personnage& john)

这会影响您发送给函数的原始对象。

当然,this回答指出您的switch语句将整数与字符1进行比较,而'1'是两个不同的值。