С++ Взаимодействие между class и наследование

На скрине ниже (код я не понял как красиво сюда вставить, кашу выдаёт) мне нужно сделать так, чтобы 2 разных класса могли взаимодействовать друг с другом, например один это враг, а второй это мы как пользователь или игрок (я всё на игры перевожу, так проще) и нужно, чтобы враг наносил урон игроку, а игрок врагу. Сделать формулы не сложно, сложно сделать так, чтобы были взаимодействия между обоими классами.

И мне хотелось бы знать:

  1. я вообще в том направлении иду или надо иначе делать, если так, то будьте добры подкинуть тем для изучения и хоть какой пример без этих надоевших Х и Y, брррр.

  2. Если всё же направление верное, то как мне объявить переменные в главном (мамином) классе, ибо ругается только на него и причина тому - необъявленная переменная health от класса Enemy в классе Player. 2.1. Я знаю что можно сделать переменную health в главном классе, но там чехарда с указателями начинается, если же то, что я делаю в данный момент в принципе не жизнеспособно, то подскажите на моём примере как сделать правильно. P.s. На скрине и код и ошибка ниже в логе.

    #include <iostream>
    using namespace std;
    class Library {
    public:
        class Player &p;
        class Enemy  &e;
    };
    class Player : public Library{
    public:
        int health;
        Player *p;
        void test()
        {
            p->health = 100;
            e.health = 123;
        }
    };
    class Enemy : public Library{
    public:
        int health;
        Enemy *e;
        void testEnemy()
        {
            e->health = 666;
            p.health = 123;
        }
    };
    

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Harry

Ну, во-первых, незачем множить "здоровья", во-вторых, родительский класс по хорошему не должен ничего знать о наследниках, и тем паче содержать их (неинициализированные ссылки) в себе, в третьих, нельзя использовать необъявленный класс, в четвертых...

Словом, я бы делал так:

class Character
{
protected:
    int health;
public:
    Character(int h):health(h){}
    int getHealth() const { return health; }
    void setHealth(int h) { health = h; }
};

class Enemy;

class Player : public Character
{
public:
    Player(int h):Character(h){}
    void test(Enemy& e);
};

class Enemy : public Character
{
public:
    Enemy(int h):Character(h){}
    void testEnemy(Player&p);
};

void Player::test(Enemy& e)
{
    health += 100;
    e.setHealth(e.getHealth()-123);
}

void Enemy::testEnemy(Player&p)
{
    health += 666;
    p.setHealth(p.getHealth()-123);
}
→ Ссылка