我有一个抽象的单例类。我的目标是任何子类只需要实现 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() 受保护并且不能从公共静态函数调用。这个问题有2个解决方案。首先我们可以公开 init() 函数,但我不想公开这个函数。所以这只剩下第二种解决方案,改变子类如下:
class SubSingleton : public Singleton<SubSingleton>
{
friend class Singleton<SubSingleton>;
protected:
void init()
{
cout << "Init SubSingleton" << endl;
}
};
这完美地工作,但我不想要朋友声明,因为其他程序员可能会扩展我的代码并且可能不知道应该添加它。
如果没有朋友声明,还有其他方法可以实现吗?也许安德烈亚历山德雷斯库的任何东西?
编辑:现在在构造函数中调用 init 函数而不是 instance() 函数。
EDIT2:出于技术原因和兼容性,我需要一个 init() 函数,不能只在构造函数中进行初始化。
转换的解决方案有效,但如果我从构造函数调用 init() ,则转换不再起作用。有什么建议么?