2

我正在使用 C++ (Qt)。

我正在扩展一个单例类,而一个子类只有静态方法。我没有创建子类的任何实例。单例类的构造函数和析构函数都是私有的,所以我无法访问它的构造函数和析构函数。

 class Singleton 
 { 
   private :
           Singleton();
           ~Singleton();
   public :
      // some methods.
 }

 class SubClass : public Singleton
 {
   // There is NO constructor or destructor
   public:
   // Only some STATIC methods.
 }

我使用调用父级的 getInstance()的SubClass::getInstance() 。我只使用子类的静态方法(所以不需要实例化子类)。

所以我的问题是,我在编译时收到警告-

“子类:无法生成析构函数,因为基类析构函数不可访问”。

我想摆脱这些警告,还想知道这种设计是否违反了单例设计模式?


我想实现什么?

我正在为应用程序创建记录器。我正在使用第三方库的记录器类(QxtCore 库的 QxtLogger)。这个 QxtLogger 类是一个单例并且具有私有的构造函数和析构函数。我想要一个单例类,其中包含 QxtLogger 拥有的所有方法和一些额外的静态方法(特定于我的应用程序)。

所以我创建了一个继承 QxtLogger 的类,并为其添加了一些静态方法。我担心的是扩展生成警告的单例类(因为基类构造函数和析构函数不可访问)。所以我该怎么做?

4

2 回答 2

6

您不能扩展没有可见构造函数的类。这就是类设计者的意图。

如果他们想要扩展类,他们会创建构造函数/析构函数protected

我建议你使用组合而不是继承。

于 2012-05-03T08:44:41.280 回答
2

停止!

除了对 Singleton 反模式的可疑使用(再次)之外,您应该记住 C++ 不是 Java。

因此,有更好的继承方式来扩展类的功能:自由函数!

void extend1(Singleton& s, ...);

int extend2(Singleton const& s);

请注意,这些函数Singleton通过引用获取类有两个原因:

  • 很明显,他们依赖它
  • 它为重构铺平了道路,因为你什么时候会摆脱 Singletonness
于 2012-05-03T09:06:37.633 回答