You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我在C++开发巫师游戏原型时无法更新类属性?

问题修正方案

以下是代码中存在的4个核心错误及对应修正方法:

  • 构造函数赋值方向错误:所有构造函数内的赋值逻辑写反,将形参赋值给类成员的逻辑错写为类成员赋值给形参,全局int类型成员默认初始值为0,因此首次打印所有属性均为0。
    错误示例(Wizard构造函数):
    Wizard(int d, int h, int s)
    {
        d = damage;
        h = health;
        s = stamina;
    }
    
    修正后:
    Wizard(int d, int h, int s)
    {
        damage = d;
        health = h;
        stamina = s;
    }
    
    Goblin类构造函数按相同逻辑修改即可。
  • setter方法赋值方向错误:所有属性的set方法同样写反赋值逻辑,导致调用set方法无法修改类成员属性。
    错误示例(setDamage方法):
    void setDamage(int v) { v = damage; }
    
    修正后:
    void setDamage(int v) { damage = v; }
    
    两个类的所有set方法均按此逻辑修改。
  • attack函数参数为值传递:函数形参是实参的副本,修改副本不会作用到原全局实例,需改为引用传递才能修改原对象属性。
    错误写法:
    void attack(Wizard attacker, Goblin target)
    
    修正后:
    void attack(Wizard& attacker, Goblin& target)
    
  • printInfo打印逻辑错误:哥布林的伤害和血量打印时调用的get方法写反,导致属性输出错位。
    错误写法:
    std::cout << "Goblin Damage: " << goblin.getHealth() << std::endl;
    std::cout << "Goblin Health: " << goblin.getDamage() << std::endl;
    
    修正后:
    std::cout << "Goblin Damage: " << goblin.getDamage() << std::endl;
    std::cout << "Goblin Health: " << goblin.getHealth() << std::endl;
    

完整修正后代码

#include <iostream>

class Wizard
{
    public:
        int damage;
        int health;
        int stamina;

        Wizard(int d, int h, int s)
        {
            damage = d;
            health = h;
            stamina = s;
        }

        float getDamage() { return damage; }
        void setDamage(int v) { damage = v; }

        float getHealth() { return health; }
        void setHealth(int v) { health = v; }

        float getStamina() { return stamina; }
        void setStamina(float v) { stamina = v; }

};

class Goblin
{
    public:
        int health;
        int damage;

        Goblin(int h, int d)
        {
            health = h;
            damage = d;
        }

        float getHealth() { return health; }
        void setHealth(int v) { health = v; }

        float getDamage() { return damage; }
        void setDamage(int v) { damage = v; }
};

Wizard wizard(50, 150, 10);
Goblin goblin(150, 25);

void attack(Wizard& attacker, Goblin& target);
void printInfo();

int main()
{
    attack(wizard, goblin);
    printInfo();

    return 0;
}

void attack(Wizard& attacker, Goblin& target)
{
    if(target.getDamage() > 0.0)
    {
        attacker.setStamina(attacker.getStamina() - 1);
    }
}

void printInfo()
{
    std::cout << "Wizard Health: " << wizard.getHealth() << std::endl;
    std::cout << "Wizard Damage: " << wizard.getDamage() << std::endl;
    std::cout << "Wizard Stamina: " << wizard.getStamina() << std::endl;
    
    std::cout << std::endl;

    std::cout << "Goblin Damage: " << goblin.getDamage() << std::endl;
    std::cout << "Goblin Health: " << goblin.getHealth() << std::endl;
}

修正后运行输出:

Wizard Health: 150
Wizard Damage: 50
Wizard Stamina: 9

Goblin Damage: 25
Goblin Health: 150

内容的提问来源于stack exchange,提问作者Bluegenic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 12:57:03