C++跨类变量访问问题:宝可梦游戏敌方生命值未更新
问题原因与解决方案
核心问题是函数参数按值传递,修改的是对象副本而非原对象:
在attackEnemy(Pokemon _reciever)函数中,参数_reciever是按值传递的。调用函数时程序会创建传入对象(也就是Bulbasaur)的副本,你在函数内修改的只是这个副本的Health值,原对象的属性完全不会被改变,所以输出的生命值始终没有变化。
修复方案
1. 将参数改为引用传递
把attackEnemy的参数类型修改为Pokemon&(引用类型),这样函数会直接操作原对象而非副本:
void attackEnemy(Pokemon& _reciever) { // 直接修改原对象的生命值 _reciever.Health = _reciever.Health - 5; }
2. (可选)复用已实现的updateHealth方法
你已经写了updateHealth方法,可以直接调用它来统一生命值修改逻辑,减少重复代码:
void attackEnemy(Pokemon& _reciever) { _reciever.updateHealth('-', 5); }
修改后运行main函数,每次调用Charmender.attackEnemy(Bulbasaur)都会直接减少Bulbasaur的生命值,控制台输出的数值会持续递减。
额外建议
- 建议将类的成员变量(
Name、Type、Health)设置为private,通过public的get/set方法访问和修改,符合面向对象的封装原则。 - 可以给
attackEnemy增加伤害值参数,让不同宝可梦的攻击伤害可以自定义,更贴合宝可梦游戏的设定。
内容的提问来源于stack exchange,提问作者Rick Huisman
相关产品推荐
相关产品推荐

