最近我对工具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/