gpt4 book ai didi

c++ - 以对象为参数调用成员函数

转载 作者:行者123 更新时间:2023-11-28 00:00:00 25 4
gpt4 key购买 nike

我目前正在我的大学上一门中级 c++ 类(class),我们刚刚完成类(class)/多态性,所以我决定自己做一个小项目。这不是家庭作业,我想我会解决这个问题。

所以我正在使用 SFML 制作一个“放置”小游戏。这由一个实体类、一个武器类和一个盔甲类组成。我有 2 个实体,分别是玩家和“其他”或敌人。到目前为止一切都很好,但是当我试图调用实体类上的成员函数并将参数作为另一个实体时,我遇到了麻烦。下面是两个函数

/*
Simulates the entity attacking another entity
*/
void Entity::attackEntity(Entity other) {
other.decreaseHP(5);
if (other.getCurrentHP() <= 0) {
killEntity(other);
}
}

/*
Simulates main entity defeating another
*/
void Entity::killEntity(Entity other) {
if (other.getEntityType() == "Enemy") {
other.setXP(rand() % (other.getRequiredXP() / 9) + 1);
addXP(other.getXP());
//addXP(rand() % (rand() % (getRequiredXP() / 10) + 1) + getEntityLevel()); // testing
addGold(rand() % getEntityLevel() + getEntityLevel());

// Increment the level of the entity to give them better armor/weapon
other.incrementLevel();
// Regenerate a weapon and armor for the enemy
other.setWeapon(other.getWeapon().generateRandomWeapon(other.getEntityLevel()));
other.setArmor(other.getArmor().generateRandomArmor(other.getEntityLevel()));
}
else if (other.getEntityType() == "Player") {
other.setXP(other.getXP() / 10);
other.setCurrentHP(other.getMaxHP());
other.refreshEntityInfo();
}
}

目前,在主程序中,我称它为

if (clock.getElapsedTime().asSeconds() >= 1.0f) {
player.attackEntity(enemy);
clock.restart();
}

想要代码做的是每隔 1 秒,玩家将“攻击”另一个实体,成为敌人。这将使另一个实体的生命值减少 5,当另一个实体的生命值低于 1 时,它将“杀死”该实体,授予玩家经验并重置另一个实体的盔甲和武器,这将赋予它新的统计数据。然而,正在发生的是什么。健康点数不会减少。显然我在这里做错了,因为它不起作用。

我测试了在时间循环中单独调用 decreaseHP() 方法并且有效:

if (clock.getElapsedTime().asSeconds() >= 1.0f) {
//player.attackEntity(enemy);
player.decreaseHP(5);
clock.restart();
}

但我在使用 attackEntity() 方法之前提供的方式并没有。

这里是 decreaseHP() 方法。

/*
Decreases the entity's current health by amount
*/
void Entity::decreaseHP(int amount) {
setCurrentHP(getCurrentHP() - amount);
}

我需要传递另一个实体对象作为引用吗?我是否以糟糕的方式处理这些功能?我应该如何处理这个问题?

编辑——所以我知道我刚刚发布了这个,但我更改了 attackEntity() 函数和 killEntity() 函数的参数,因此它通过引用获取实体对象,这似乎解决了这个问题。

/*
Simulates main entity defeating another
*/
void Entity::killEntity(Entity &other) {
if (other.getEntityType() == "Enemy") {
other.setXP(rand() % (other.getRequiredXP() / 9) + 1);
addXP(other.getXP());
//addXP(rand() % (rand() % (getRequiredXP() / 10) + 1) + getEntityLevel()); // testing
addGold(rand() % getEntityLevel() + getEntityLevel());

// Increment the level of the entity to give them better armor/weapon
other.incrementLevel();
// Regenerate a weapon and armor for the enemy
other.setWeapon(other.getWeapon().generateRandomWeapon(other.getEntityLevel()));
other.setArmor(other.getArmor().generateRandomArmor(other.getEntityLevel()));
}
else if (other.getEntityType() == "Player") {
other.setXP(other.getXP() / 10);
other.setCurrentHP(other.getMaxHP());
other.refreshEntityInfo();
}
}

/*
Simulates the entity attacking another entity
*/
void Entity::attackEntity(Entity &other) {
other.decreaseHP(5);
if (other.getCurrentHP() <= 0) {
killEntity(other);
}
}

但是,我最后的问题仍然存在:我这样做的方式是否正确?

最佳答案

签名 void Entity::attackEntity(Entity other) 导致 other 成为实体的拷贝。对 other 所做的任何更改都是 attackEntity 函数的本地更改。

如果您需要从源项中保留更改,最直接的方法是通过引用传递 other,将签名更改为:void Entity::attackEntity(Entity&其他)

关于c++ - 以对象为参数调用成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39904685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com