从单身派生:每个基础和派生的一个对象?

时间:2013-10-08 10:08:23

标签: c++ inheritance

我有一个singleton class Avirtual protected destructorprivate 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

3 个答案:

答案 0 :(得分:0)

这完全取决于你的单身人士的实施方式。如果它有某种类型的公共构造函数,那么将它的单例扩展到B的派生实例可能就好了。如果它是某种工厂方法,那么可能不是。它具有protected dtor的事实表明它是为了用作基类而构建的。

答案 1 :(得分:0)

不要与两个独立的习语混淆:

  • 继承是C ++语言机制的一部分
  • Singleton是一个实例化策略,在您的代码中定义

所以你的问题的答案是“这取决于你如何实施实例化政策”。

答案 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() {
         ...
    }

};

此特定版本要求您的基类具有默认构造函数。其他更复杂的接口可以缓解这个问题。

总的来说,正如一些评论所指出的那样,单例作为一种模式具有可扩展性问题,尽管通常认为常数单体更安全。