首页 文章

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

提问于
浏览
2

我正在使用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.
 }

我使用调用parent的getInstance()的 SubClass::getInstance() . 我只使用SubClass的静态方法(因此不需要实例化SubClass) .

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

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

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


What I want to Achieve?

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

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

2 回答

  • 2

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

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

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

  • 4

    STOP!

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

    因此,有一些 better 方法继承来扩展类的功能:自由函数!

    void extend1(Singleton& s, ...);
    
    int extend2(Singleton const& s);
    

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

    • 明确表示他们依赖它

    • 它为重构铺平了道路,因为当你摆脱单身人士时

相关问题