Как решить проблему с ООП? Есть первый базовый классclass FireParent
{
public:
FireParent(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);

...

private:


};
Есть классы, которые от него наследуется:class Bullet : public FireParent
{
public:
Bullet(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};
class Rocket : public FireParent
{
public:
Rocket(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};
Есть второй базовый класс, с полем типа FireParentclass TowerParent
{
public:
TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);

...
FireParent* towerFire;

private:

};
Есть классы, которые наследуются от TowerParent:class SimpleTower : public TowerParent
{
public:
SimpleTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
private:

};
class RocketTower : public TowerParent
{
public:
RocketTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
private:

};
Как сделать так, чтобы атрибут towerFire у класса SimpleTower был Bullet, а у класса RocketTower - Rocket ?

21 Авг 2019 в 07:07
196 +1
0
Ответы
1

Для решения данной проблемы можно использовать полиморфизм.

Вам нужно создать абстрактный класс Fire и сделать классы Bullet и Rocket его дочерними классами. Затем измените тип towerFire в классе TowerParent на Fire*. Теперь вы можете присваивать объекты типа Bullet или Rocket этому полю в зависимости от типа конкретной башни.

Пример:

class Fire {
public:
virtual ~Fire() {}
};
class Bullet : public Fire {
public:
Bullet(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
};
class Rocket : public Fire {
public:
Rocket(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
};
class TowerParent {
public:
TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
Fire* towerFire;
};
class SimpleTower : public TowerParent {
public:
SimpleTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
void setTowerFire(Bullet* bullet) {
towerFire = bullet;
}
};
class RocketTower : public TowerParent {
public:
RocketTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);
void setTowerFire(Rocket* rocket) {
towerFire = rocket;
}
};

Теперь вы можете создать объекты типа Bullet и Rocket и передать их в соответствующие методы setTowerFire для SimpleTower и RocketTower соответственно.

20 Апр 2024 в 13:07
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир