首页 > 解决方案 > 为什么我不能在 C++ 中更新我的类属性?

问题描述

我正在制作一个向导游戏原型,但遇到了一个问题:

我创建了一个名为 Wizard 的类和一个名为 Goblin 的类:

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

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

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

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

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

};

class Goblin
{
    public:
        int health;
        int damage;

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

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

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

然后,我为它们声明和初始化变量:

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

然后,我创建了一个attack()函数:

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

因此,在主函数中,我调用了攻击并打印出结果:

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

    return 0;
}

但这是结果:

> clang++-7 -pthread -std=c++17 -o main main.cpp
> ./main
Wizard Health: 0
Wizard Damage: 0
Wizard Stamina: 0

Goblin Damage: 0
Goblin Health: 0

我还创建了一个printInfo()函数:

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.getHealth() << std::endl;
    std::cout << "Goblin Health: " << goblin.getDamage() << std::endl;
}

如果您需要,这是完整的文件:

#include <iostream>

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

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

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

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

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

};

class Goblin
{
    public:
        int health;
        int damage;

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

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

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

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.getHealth() << std::endl;
    std::cout << "Goblin Health: " << goblin.getDamage() << std::endl;
}

抱歉,如果这很长,但我们将不胜感激。

标签: c++class

解决方案


您的attack()函数按值接受参数。因此,它会修改全局变量的副本。

使用参考:

void attack(Wizard& attacker, Goblin& target)
{
    ...
}

PS:另见https://en.cppreference.com/w/cpp/language/constructor了解成员初始化列表


推荐阅读