C++ 对象变量未更新
传递到dAttack方法的Player对象未更新其在dAttack(Player)上的hp。龙受到的伤害很好,但玩家不会。我知道,C++中最好的做法是在主函数中定义类,但是当我试图把它们变成自己的.CPP文件时,我得到一个错误,说明“播放器”和“DRON”对象未初始化。 我尝试将dAttack()中的hit变量重命名为dHit,但没有其他想法C++ 对象变量未更新,c++,oop,C++,Oop,传递到dAttack方法的Player对象未更新其在dAttack(Player)上的hp。龙受到的伤害很好,但玩家不会。我知道,C++中最好的做法是在主函数中定义类,但是当我试图把它们变成自己的.CPP文件时,我得到一个错误,说明“播放器”和“DRON”对象未初始化。 我尝试将dAttack()中的hit变量重命名为dHit,但没有其他想法 #包括 #包括 int main() { 职业选手{ 公众: 浮动hMul; 浮动dMul; 浮萍; 浮动高压; void setHMul(float h
#包括
#包括
int main()
{
职业选手{
公众:
浮动hMul;
浮动dMul;
浮萍;
浮动高压;
void setHMul(float h){hMul=h;};
void setDMul(float d){dMul=d;};
void setAMul(float a){aMul=a;};
void setHP(){hp=hMul*100;};
};
班龙{
公众:
浮动dHp;
浮动dAt;
无效dAttack(玩家){
浮点数dhit=dAt*2;
player.hp-=dhit;
std::cout首先给出一些一般性建议:
- 少写代码,多测试。您面临的问题在代码中至少出现两次。如果代码中只有一个bug/错误,那么修复bug/错误就容易得多。这听起来可能很疯狂,但确保您没有更多bug/错误的简单方法是只写一行代码,并且只有当您知道它可以继续执行时
- 当你遇到一些不符合你期望的事情时,写一个只有这个问题的小示例程序。首先,它可以帮助你找到/解决问题,如果你没有找到,你可以在这里发布。它将帮助我们帮助你
针对该问题的mcve可能如下所示:
void take_dmg(int x) { x -= 1; }
int main() {
int hp = 10;
while (hp > 0) {
take_dmg(hp);
}
}
这将永远循环,main
中的hp
将永远不会有任何与10
不同的值。这是因为函数中的x
是hp
的副本。您需要的是中的参考
void take_dmg(int& x) { x -= 1; }
//^^ ------------------ pass by reference
int main() {
int hp = 10;
while (hp > 0) {
take_dmg(hp);
}
}
现在,x
是对hp
的引用。粗略地说,引用只是原始值的别名,因此在函数中递减x
会在main
中递减hp
您应该注意的术语是“按值传递”(第一个断开的示例)和“按引用传递”(固定的)
最后,不要在函数范围内声明类。这是一种语言功能,在某些情况下是必要的,但在一般情况下,类应该在函数之外声明(也就是在main
之外).你通过复制而不是引用来传递Player
。你真的应该养成习惯,把类分解成它们自己的.h(接口)和.cpp(实现)源文件。但是你实际的问题是void dAttack(Player Player)
等。你不小心创建了一个新对象。你需要“通过引用传递”(在这里,试试好奇:DATTACK(播放器和播放器)和PATTACK(玩家和玩家)出于好奇,什么参考书或学习书籍教给在代码<主< /代码>函数中声明类?大多数C++代码(98%)我遇到的,声明了main
之外的类。在比较之前,可以通过将字符输入或文本输入转换为所有小写或所有大写来消除大量比较。例如:if(std::toupper(choice)='W')
void take_dmg(int& x) { x -= 1; }
//^^ ------------------ pass by reference
int main() {
int hp = 10;
while (hp > 0) {
take_dmg(hp);
}
}