Я думаю, что полиморфизм - это то, что вам нужно для вашего случая использования и решит ваши проблемы.
Предположим, у вас есть базовый класс для ваших животных:
class Animal
{
// ...
// Create all the (pure) virtual methods to be redefined by a derived class
virtual void walk() = 0; // For example
};
Затем вы определяете двух своих конкретных животных, кролика и ежа:
class Rabbit : public Animal
{
// ...
// Redefine here the (pure) virtual methods of Animal for a Rabbit
void walk() override;
};
class HedgeHog : public Animal
{
// ...
// Redefine here the (pure) virtual methods of Animal for a HedgeHog
void walk override;
};
И вы можете использовать полиморфизм для обработки списка животных:
std::vector<Animal*> race_competitors;
race_competitors.push_back(new Rabbit);
race_competitors.push_back(new HedgeHog);
И этоКстати, когда вы вызовете метод walk()
над конкурентом, он автоматически выполнит правильное правило ходьбы соответствующего животного.
Конечно, в конце гонки не забудьте delete
содержание вектора, потому что животные были созданы с помощью new
(«вручную» выделенная память, в куче).
Только для информации, класс Game
не имеетчтобы унаследовать от Rabbit
и HedgeHog
, нужно просто знать их как учеников или, что еще лучше, сохранить std::vector<Animal*>
в качестве списка конкурентов.
Надеюсь, это поможет вам улучшитьВаш дизайн и решить ваши проблемы.