【发布时间】:2021-11-02 11:20:07
【问题描述】:
我一直在尝试找到一个单例实现,其中:
- 我可以有一个抽象类
Application - 并且可以有多个从
Application派生的类,例如SampleApplication和OtherSampleApplication。 - 但我只想要
Application的一个实例,无论实际类型是什么,所以我一直在尝试将其设为单例。
这是我当前的单例实现:
template<class T>
class Singleton
{
public:
static T& GetInstance()
{
static T instance;
return instance;
}
Singleton(Singleton const&) = delete;
Singleton(Singleton&&) = delete;
Singleton& operator=(Singleton const&) = delete;
Singleton& operator=(Singleton&&) = delete;
protected:
Singleton() = default;
virtual ~Singleton() = default;
};
然后,对于派生类,我尝试了很多方法:
-
class Application : public Singleton<Application>与class SampleApplication : public Application
这不起作用,因为我们正在尝试创建Application实例而不是SampleApplication。 -
class Application : public Singleton<Application>与class SampleApplication : public Application, public Singleton<SampleApplication>
这不会编译,因为GetInstance()不明确。我尝试使用virtual继承解决此问题,但无法编译。 -
class Application与class SampleApplication : public Application, public Singleton<SampleApplication>
不符合我上面列出的“要求”,因为我们可以拥有另一个派生类的另一个单例。
有谁知道实现这一点的方法吗?
【问题讨论】:
-
一种可能的方法是使用多重继承 (2) 并在
SampleApplication类中明确指定首选方法:public: using Singleton<SampleApplication>::GetInstance; -
Application abstract 具有 GetInstance,或者
Singleton<Application>,并且main传递到派生的 Application 实例中。如果单例已经用实例初始化,它不允许第二次重新初始化(抛出异常?返回错误代码?静默忽略?)。 -
如果你让它工作,你打算如何使用它?我不清楚您打算让动态调度进入的位置,因为您在单例中存储了一个普通的
T。 -
只能有一个
Application对象,并且该对象是从Application派生的类的子对象。因此,只有一个派生自Application的类在程序运行时被实例化,对吧?你在编译时知道这是哪个派生类吗? -
@dewaffled 这样做并添加另一个
OtherSampleApplication类,您可以拥有如下内容:SampleApplication& application = SampleApplication::GetInstance();OtherSampleApplication& otherApplication = OtherSampleApplication::GetInstance();
标签: c++ inheritance singleton