C++Singleton模板类继承
C++ Singleton template class inheritance
我有一个抽象的Singleton类。我的目标是,任何子类都只需要实现init()函数,而不需要实现其他函数。以下是我所做的:
template <typename T>
class Singleton
{
public:
Singleton()
{
init();
}
static T& instance()
{
static T instance;
return instance;
}
protected:
virtual void init() = 0;
};
class SubSingleton : public Singleton<SubSingleton>
{
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};
这不会编译,因为init()是受保护的,不能从公共静态函数调用。这个问题有两种解决方案。首先,我们可以公开init()函数,但我不想公开这个函数。因此,这只剩下第二个解决方案,更改子类如下:
class SubSingleton : public Singleton<SubSingleton>
{
friend class Singleton<SubSingleton>;
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};
这非常有效,但我不想要friend语句,因为其他程序员可能会扩展我的代码,但可能不知道应该添加它。
在没有朋友声明的情况下,还有其他方法可以实现这一点吗?也许是安德烈·亚历山德雷斯库的什么?
EDIT:现在在构造函数中调用init函数,而不是instance()函数
EDIT2:由于技术原因和兼容性,我需要一个init()函数,不能只在构造函数中进行初始化
强制转换的解决方案是有效的,但如果我从构造函数调用init(),强制转换就不再有效了。有什么建议吗
您根本不需要这个init()东西。这只会在这里制造问题。
template <typename T>
class Singleton
{
public:
static T& instance()
{
static T instance;
return instance;
}
};
class SubSingleton : public Singleton<SubSingleton>
{
public:
SubSingleton()
{
cout << "Init SubSingleton" << endl;
}
};
通过这种方式,您不仅可以删除不必要的内容,而且还可以防止每次有人调用instanse()时调用init()。。。
问题是您没有按照预期使用虚拟函数。i、 e现在没有多态性在起作用。为什么?因为您对直接派生的对象调用init()。init()函数是虚拟的,当您在基类引用或基类指针上调用init()时,如下所示。然后从基类范围进行调用,由于instance()方法是基类方法,因此从中调用受保护的方法是非常好的。
static T& instance()
{
static T myInstance;
Singleton<T>& t = myInstance; // Just define a dummy reference here.
t.init();
return myInstance;
}
似乎混合了两种类型的polimorpysms:
1) 如果你想"静态"调用SubSingleton::init()
,即使用CRTP,你不需要在基类中定义它——但你真的必须让基类可以访问它。
2) 但是,如果您将init()定义为虚拟的,则使用动态多态性,并且不需要将init()
公开:
static T& instance()
{
static T instance;
static_cast<Singleton<T> &>(instance).init();
return instance;
}
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- C++ Singleton - Prevent ::instance() to variable
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 公共与私人继承
- 如何创建从同一类继承的不同对象的向量
- 如何从另一个文件继承私有成员变量和公共函数
- 在模板基类中为继承类中的可选重写生成虚拟方法
- 带有继承的C++工厂
- 我应该避免多重实现继承吗
- C++继承更改成员
- C++Singleton模板类继承
- C++Singleton类-继承的良好实践
- Singleton类和多重继承