C ++: применять Singleton на подклассах ABC - PullRequest
0 голосов
/ 22 февраля 2019

В уже существующей платформе 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: пожалуйста, не делайте.Спасибо.

...