c++ - 为什么我不能在 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;
}
抱歉,如果这很长,但我们将不胜感激。
解决方案
您的attack()
函数按值接受参数。因此,它会修改全局变量的副本。
使用参考:
void attack(Wizard& attacker, Goblin& target)
{
...
}
PS:另见https://en.cppreference.com/w/cpp/language/constructor了解成员初始化列表
推荐阅读
- php - 从 glob 数组 PHP 中排除多个键
- javascript - 如何简洁地使用 lodash 更新嵌套的对象数组?
- cookies - 使用 Supertest 时未定义 request.cookies
- python - 我可以通过 django python 中的 model.py 插入到 db
- tpm - TPM 2.0:避免每次使用的密钥(重新)生成开销
- weaviate - 分类问题,POST 到分类会导致错误
- css - calc() 中的 CSS min() 在 Firefox 中中断,但在 chrome 中没有
- android - 从 D 导航返回时防止破坏(或恢复状态)片段 B - 导航组件
- javascript - 网络套接字 | 净::ERR_CONNECTION_REFUSED
- c++ - ...(省略号)作为函数原型中的一个且唯一的函数参数在 C++ 中意味着什么?