我是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;
}
答案 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;
}
}
vie
和degat
都指向调用方法的对象的字段。您从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'
是两个不同的值。