C ++:对ABC的子类强制实行Singleton

时间:2019-02-22 12:52:43

标签: c++ singleton abstract-base-class

在一个已经存在的Simulation框架中,我正在尝试在已经存在的抽象模型基类上实现状态模式。因为模型类只是一个ABC,所以状态也应该是ABC。 我正在寻找一种在州ABC的所有可能子类上实施单例模式的方法。

这是我到目前为止尝试过的:

template<typename T> class SingletonBase
{
public:
[...]
static T* getInstance()
{
    if (instance == nullptr)
    {
        instance = new T();
    }
    return instance;
}
protected:
  SingletonBase(){}
  static T* instance;

这是我所在州的ABC:

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。

我现在尝试创建以下状态的具体状态的基类,以用于仿真中(需要此基类,以便所有Context具有相同的类型):

class StateBaseForSimulationScenario : public State<foobar, barfoo, StateBaseForSimulationScenario>

现在我遇到了两个问题:

1)显然,状态库的每个子级的getInstance()方法只会生成一个状态库

2)如果我不是使用statebase类型作为模板参数,而是使用具体类型,则Context将不匹配(例如,带有StateIdle参数的Context与带有StateProducing参数的Context类型不同)

所以我的问题是:是否有一种方法可以强制所有将来的所有State子类成为Singleton?还是在C ++中无法通过这种方式实现?

P.S .:如果您的答案是Sigletons是反图案/不良设计等,或者我只是应该使用boost:请不要。谢谢。

0 个答案:

没有答案