В уже существующей платформе Simulation я пытаюсь реализовать шаблон состояния для уже существующих абстрактных базовых классов моделей.Так как класс модели - это только ABC, то должны быть и состояния.Я ищу способ применения шаблона синглтона на всех возможных дочерних классах ABC состояний.
Вот что я пробовал до сих пор:
template<typename T> class SingletonBase
{
public:
[...]
static T* getInstance()
{
if (instance == nullptr)
{
instance = new T();
}
return instance;
}
protected:
SingletonBase(){}
static T* instance;
Вот азбукамое состояние:
template <typename A, typename B, typename StateType>
class State : public SingletonBase<StateType>
{
public:
virtual ~State(){}
virtual void foo(Context<A,B,StateType>* ctx, ...) = 0;
virtual void bar(Context<A,B,StateType>* ctc, ...) = 0;
protected:
State(){}
virtual void changeState(Context<A, B, StateType>* ctx, State<A, B, StateType>* state);
private:
friend class SingletonBase<State<A, B, StateType>>;
};
Класс контекста принимает те же три параметра шаблона, что и для определения типа его состояния.И, наконец, шаблоны нового класса наследуются от Context и ABC используемых моделей.
Теперь я попытался создать базовый класс для конкретных состояний, используя при моделировании следующий способ (этот базовый класс необходим для того, чтобы всеКонтекст имеет тот же тип):
class StateBaseForSimulationScenario : public State<foobar, barfoo, StateBaseForSimulationScenario>
Теперь я допускаю две проблемы:
1) Очевидно, что метод getInstance () каждого дочернего элемента базы состояний будет производить только базу состояний
2) Если я вместо того, чтобы использовать тип базы состояния в качестве параметра шаблона, использую конкретный тип, контекст не будет совпадать (например, контекст с параметром StateIdle явно не совпадает с типом контекста с параметром StateProduc)
Итак, мой вопрос таков: есть ли способ заставить все будущие дочерние классы State быть Singleton?Или это просто невозможно в C ++?
PS: Если вы ответили, что Sigletons - это анти-паттерн / плохой дизайн и т. Д. Или я просто должен использовать boost: пожалуйста, не делайте.Спасибо.