C ++ - Изменение класса для использования виртуальных функций - PullRequest
0 голосов
/ 30 апреля 2020

Я хочу сделать это более эффективным, как бы я переписал класс Enemy для использования наследования и виртуальных функций? Включая любые новые дочерние классы.

class Enemy
{
public:
    int type; // 0 = Dragon, 1 = Robot
    int health; // 0 = dead, 100 = full
    string name;
    Enemy();
    Enemy(int t, int h, string n);
    int getDamage(); // How much damage this enemy does
};
Enemy::Enemy() : type(0), health(100), name("")
{ }
Enemy::Enemy(int t, int h, string n) :
    type(t), health(h), name(n)
{ }
int Enemy::getDamage() {
    int damage = 0;
    if (type == 0) {
        damage = 10; // Dragon does 10
        // 10% change of extra damage
        if (rand() % 10 == 0)
            damage += 10;
    }
    else if (type == 1) {
        // Sometimes robot glitches and does no damage
        if (rand() % 5 == 0)
            damage = 0;
        else
            damage = 3; // Robot does 3
    }
    return damage;
}

Это вычисляет, сколько общего урона группа нанесет sh.

int calculateDamage(vector<Enemy*> bandOfEnemies)
{
    int damage = 0;
    for (int i = 0; i < bandOfEnemies.size(); i++)
    {
        damage += bandOfEnemies[i]->getDamage();
    }
    return damage;
}

1 Ответ

1 голос
/ 30 апреля 2020

Это хорошее начало, но с наследованием вам не нужно быть таким конкретным c. Например, в классе врага у вас есть атрибут type. Если вы хотите использовать наследование, вам не нужно указывать type, потому что производный класс будет type.

Что касается вашей функции getDamage(), вы можете оставить ее пустой и превратить его в виртуальную функцию. Собрав все это вместе, ваш код должен выглядеть примерно так:

class Enemy
{
public:
    int health; // 0 = dead, 100 = full
    string name;

    Enemy();
    Enemy(int t, int h, std::string n);

    virtual int getDamage() = 0; // pure virtual function
};

Enemy::Enemy()
    : type(0), health(100), name("") {}

Enemy::Enemy(int t, int h, std::string n)
    : type(t), health(h), name(n) {}


// class 'Dragon' inherits from class 'Enemy'
class Dragon : public Enemy
{
public:
    Dragon() {}

    int getDamage()
    {
        // dragon's damage
    }
};

Обратите внимание, что если вы хотите создать другого врага, вы просто наследуете от класса Enemy. И таким образом, вы можете хранить свои символы в массиве так:

vector<Enemy> enemies = {
    Dragon(),
    Dragon(),
    Robot()
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...