Как решить проблему с ООП?

Есть первый базовый класс
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:
};


Есть второй базовый класс, с полем типа FireParent

class 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 ?
  • Вопрос задан
  • 474 просмотра
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Да вы, батенька, король контента!

Эт шутка. Хоть и не смешная для самоделкиных из области геймдева. :)
Так, а кроме шуток. Не надо вообще так делать. Тип наносимого урона/снаряда/юнита/орудия никогда не должен описываться его собственным классом. Все юниты должны быть одного класса, все пули - тоже, все здания - тоже.
У тебя должен быть только набор общих классов для сущностей. Конкретные параметры (что откуда вылетает, как дамажит и как это все визуально выглядит) должны лежать в ресурсах.
Рекомендую почитать: habrahabr.ru/post/255561 Изложенное куда более важно для области любимых самокатов на С++.

Хотя... Если тебе так надо реализовать на классах, а не на ресурсах, то тебе надо просто организовать фактическую связь между сущностями. Давай предложу один страшный вариант... Дебажить это все чур самому.
class TowerParent
{
public:
	// Это тип для той штуки, которая будет создавать нам нужную боеголовку.
	typedef FireParent* (*FireConstructor)( float, float, int, float, float, float );
	
	TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);

	//...
	
	FireParent* towerFire;
protected:
	FireConstructor	fire_constructor; // инстанция конструктора боеголовок.
	
	// Вот так мы будем определять тип конструируемой боеголовки.
	template< class fire_t >
	inline void DefineFireType(){
		fire_constructor = TowerParent::template MakeFire<fire_t>;
	};
	
private:
	// А вот так мы будем конструировать боеголовку.
	template< class fire_t >
	static FireParent* MakeFire( float _x, float _y, int _speed, float _angle, float _targetX, float _targetY ){
		return new fire_t( _x, _y, _speed, _angle, _targetX, _targetY );
	};
};


SimpleTower( int _col, int _row, float _posX, float _posY, float _attackRange, float _angle ){
	DefineFireType<Bullet>();
};

RocketTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle){
	DefineFireType<Rocket>();
};


Конструирование делается через:
towerFire = fire_constructor( .... );

Еще одна поправка. Не Rocket, а Missile. Потому что ... :)

UPD:
Еще один вариант, уже менее страшный - это шаблонизация базового класса:
template< class fire_t >
class TowerParent
{
public:
	TowerParent(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle);

	//...

	fire_t* towerFire;

protected:
	inline fire_t* MkeFire( float _x, float _y, int _speed, float _angle, float _targetX, float _targetY ){
		return new fire_t( _x, _y, _speed, _angle, _targetX, _targetY );
	};
};

class Bullet : public FireParent<Bullet>
{
public:
	Bullet(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};

class Rocket : public FireParent<Rocket>
{
public:
	Rocket(float _x, float _y, int _speed, float _angle, float _targetX, float _targetY);
private:
};
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Шаблоны?
Ответ написан
Комментировать
@DISaccount
В конструкторе SimpleTower:
SimpleTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle)
{
...
towerFire = new Bullet(...);
...
}


В конструкторе RocketTower:
RocketTower(int _col, int _row, float _posX, float _posY, float _attackRange, float _angle)
{
...
towerFire = new Rocket(...);
...
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы