我有一个singleton class A
,virtual protected destructor
和private constructor
。我公开衍生出来并创建了B类。
我可以创建两个基础和派生类的对象吗?
如果我不能有其他方式共享相同的代码?
当我尝试它时,我得到编译时错误:
warning C4356: 'A::variable' : static data member cannot be initialized
via derived class
B.cpp(4): error C2371: 'variable' : redefinition; different basic types
答案 0 :(得分:0)
这完全取决于你的单身人士的实施方式。如果它有某种类型的公共构造函数,那么将它的单例扩展到B
的派生实例可能就好了。如果它是某种工厂方法,那么可能不是。它具有protected dtor
的事实表明它是为了用作基类而构建的。
答案 1 :(得分:0)
不要与两个独立的习语混淆:
所以你的问题的答案是“这取决于你如何实施实例化政策”。
答案 2 :(得分:0)
如果我理解正确,你想要实现的是一个可重用的单例模式基类。您可以使用模板基类,使用名为CRTP的模式执行此操作。 This question还提供了对此技术的简单解释。
具体而言,这意味着要做这样的事情:
template<typename TDerived>
class Singleton {
public:
static TDerived& instance() {
static TDerived instance_;
return instance_;
}
protected:
Singleton() {}
virtual ~Singleton() {}
};
class ConcreteSingleton : public Singleton<ConcreteSingleton> {
public:
...
protected:
ConcreteSingleton() {
...
}
virtual ~ConcreteSingleton() {
...
}
};
此特定版本要求您的基类具有默认构造函数。其他更复杂的接口可以缓解这个问题。
总的来说,正如一些评论所指出的那样,单例作为一种模式具有可扩展性问题,尽管通常认为常数单体更安全。