最近我对工具Singleton提出了疑问,但涉及到抽象基类。
假设我们有这样的类层次结构:

class IFoo {...}; // it's ABC
class Foo : public IFoo {...};

我们将单例类定义如下:
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;
};

因此,如果我想使用如下代码:IFoo::Instance()->foo();我该怎么办?

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

而且:class Foo : public IFoo, public Singleton<Foo> {...};也无法工作,因为这种方式IFoo类没有方法Instance()的接口(interface),因此调用IFoo::Instance()将失败。

有任何想法吗?

最佳答案

您想使用类似

IFoo my_foo = Singleton<Foo>::Instance();
my_foo->foo();

基本上,您必须使用具体的类(在本例中为Foo类)实例化Singleton模板,并且鉴于Foo派生自IFoo,您可以通过基本指针对其进行引用。您不能使用不完整或抽象的类直接实例化模板。

关于c++ - C++中的Singleton和Abstract基类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1091314/

10-11 23:02