我最近在我的Character类中添加了一个子类Enemy,该子类在其构造函数中还包含两个参数。
Enemy::Enemy(string name, int health, int stamina, bool isEnemy, bool roaming) : Character(name, health, stamina) {
this->name = name;
this->health = health;
this->stamina = stamina;
this->isEnemy = isEnemy;
this->roaming = roaming;
}
我的角色班级也有针对健康体力和当前房间的吸气剂和吸气剂。我想知道子类在类中是否还需要这些方法?因为在我的主机中,当尝试呼叫敌人(敌人位于敌人类型的向量中)当前房间时,它无法访问内存地址,并且输出也不会显示其运行状况或耐力。
for(int i = 0; i < enemies.size(); i++) {
if(currentRoom == enemies[i]->getCurrentRoom()) {
cout << enemies[i]->getName() << " HP: " << enemies[i]->getHealth() << " " << enemies[i]->getName()
<< " ST: " << enemies[i]->getStamina() << endl;
}
[如果在Character类中声明的“ getters”和“ setters”是公共的而不是纯虚拟的,并且Enemy类公开地从Character继承,就像这样:
class Enemy : public Character
敌人类不需要(也不应有)名称,健康和体力变量的“ getters”和“ setters”。检查这些条件是否正确。
[另外,查看您的Enemy类构造函数的实现,假设Character构造函数已经设置了名称,运行状况和耐力,则无需在Enemy构造函数的主体中再次进行设置(假设您没有其他三个变量在名为“名称,健康和耐力”的敌人类别中声明,如果您这样做,则是设计缺陷)。
另一件事,您正在通过Enemy构造函数按名称传递名称变量。为防止不必要的复制并因此产生更有效的代码,请根据常量构造函数是否也按值传递名称变量,通过常量引用将其传递,或将其std::move
传递给Character构造函数。对于健康和耐力变量,这不是必需的,因为它们很容易复制构造和移动构造。
总而言之,如果您的Character构造函数是这样声明的:
Character::Character(string name, int health, int stamina);
将您的敌人构造函数修改为:
Enemy::Enemy(string name, int health, int stamina, bool _isEnemy, bool _roaming) : Character(std::move(name), health, stamina), isEnemy(_isEnemy), roaming(_romaing){
}
这还需要将Character构造函数中的name参数也移到Character类的name成员中,如果尚未完成。