Как решить проблему с ООП? Есть первый базовый класс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 ?
Для решения данной проблемы можно использовать полиморфизм.
Вам нужно создать абстрактный класс 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 соответственно.
Для решения данной проблемы можно использовать полиморфизм.
Вам нужно создать абстрактный класс 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 соответственно.