0

我有一个singleton class A,virtual 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
4

3 回答 3

0

这完全取决于你的单例是如何实现的。如果它具有某种公共构造函数,那么您可能可以将其单例扩展到B. 如果它是某种工厂方法,那么可能不是。它具有 的事实表明它protected dtor是为用作基类而构建的。

于 2013-10-08T10:20:33.663 回答
0

如果我理解正确,您想要实现的是一个可重用的单例模式基类。您可以使用模板基类,使用名为CRTP的模式来做到这一点。这个问题还提供了对这种技术的简单解释。

具体来说,这意味着做这样的事情:

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

};

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

总体而言,正如一些评论中所指出的,单例作为一种模式存在可伸缩性问题,尽管 const 单例通常被认为更安全。

于 2013-10-12T17:04:45.390 回答
0

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

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

因此,您的问题的答案是“这取决于您如何实施实例化策略”。

于 2013-10-08T10:22:28.603 回答