扩展具有私有构造函数和析构函数的单例类会产生编译时警告

时间:2012-05-03 08:25:31

标签: c++ design-patterns inheritance singleton extend

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

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

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

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

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

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

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

我想摆脱这些警告和 还想知道这个设计违反了单件设计模式吗?


我想要达到什么目标?

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

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

2 个答案:

答案 0 :(得分:4)

您无法扩展没有可见构造函数的类。这就是班级设计师的意图。

如果他们希望扩展课程,他们已经制作了构造函数/析构函数protected

我建议您使用合成而不是继承。

答案 1 :(得分:2)

<强> STOP!

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

因此,继承扩展类的功能有更好方式:free-functions!

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

int extend2(Singleton const& s);

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

  • 明确表示他们依赖它
  • 它为重构铺平道路,因为当你摆脱单身人士时