C++中的Singleton和Abstract基类

11 c++ singleton

最近我遇到了关于实现Singleton但是涉及抽象基类的问题.假设我们有这样的类层次结构:

class IFoo {...}; // it's ABC
class Foo : public IFoo {...};
Run Code Online (Sandbox Code Playgroud)

我们有单例类定义如下:

template <typename T>
class Singleton
{
public:
static T* Instance() {
   if (m_instance == NULL) {
      m_instance = new T();
   }
   return m_instance;
}
private:
static T* m_instance;
};
Run Code Online (Sandbox Code Playgroud)

所以,如果我想使用如下:IFoo::Instance()->foo();我该怎么办?

如果我这样做:class IFoo : public Singleton<IFoo> {...};它将无法工作,因为Singleton将调用IFoo的ctor,但IFoo是一个ABC,因此无法创建.

而且:这个class Foo : public IFoo, public Singleton<Foo> {...};也行不通,因为这种类IFoo没有方法Instance()的接口,所以调用IFoo::Instance()会失败.

有任何想法吗?

Tim*_*sch 10

你想要使用类似的东西

IFoo my_foo = Singleton<Foo>::Instance();
my_foo->foo();
Run Code Online (Sandbox Code Playgroud)

基本上你必须使用具体的类(在这种情况下,你的类Foo)实例化模板Singleton,并且假设你的Foo派生自IFoo,你可以通过基指针引用它.您不能使用不完整或抽象类直接实例化模板.


MSa*_*ers 8

你不能这样做.IFoo是一个设计和定义的接口.因此,实例的数量为0.另一方面,单例类的定义是您有1个实例.0!= 1.