当前位置: 首页 > 知识库问答 >
问题:

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

柏明亮
2023-03-14

我使用的是C(Qt)。

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

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

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

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

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

"子类:由于基类析构函数不可访问,无法生成析构函数"。

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

我想要实现什么?

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

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

共有2个答案

蓟浩旷
2023-03-14

停止

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

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

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

int extend2(Singleton const& s);

请注意,这些函数通过引用采用单例类,原因有二:

  • 很明显,他们依赖它
  • 它为重构铺平了道路,因为当你摆脱单一性时
墨雨华
2023-03-14

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

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

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

 类似资料:
  • 问题内容: 假设我们有以下代码: 当我们创建一个对象时,该对象最初称为父类构造函数。但是就像私人的一样- 我们收到一个错误。一个好的例子和解决这个问题的方法是多少? 问题答案: 没有出路。你必须创建一个可用的(,或默认)的超级构造函数能够延长。 这种表示法通常用于实用程序类或单例中,在这种情况下,您不希望用户通过扩展实例和实例化子类,或者只是通过调用类的构造函数来自己创建类的实例。 当您只有一个具

  • 在Scala中,如何使用trait中定义的私有构造函数参数扩展类中的trait? 上面的类给出了一个错误: 类子级需要是抽象的,因为方法名位于类型的trait父级中⇒ 未定义字符串。 当然-我当然可以: 使类抽象, 在构造函数中定义它而不使用私有,例如。 使父类成为而不是trait 但是,使用上述实现,在扩展trait时,我不可能拥有私有构造函数参数吗?注意,我希望变量是私有的,这样我就不能执行c

  • 本文向大家介绍解析C#中的私有构造函数和静态构造函数,包括了解析C#中的私有构造函数和静态构造函数的使用技巧和注意事项,需要的朋友参考一下 私有构造函数 私有构造函数是一种特殊的实例构造函数。它通常用在只包含静态成员的类中。如果类具有一个或多个私有构造函数而没有公共构造函数,则其他类(除嵌套类外)无法创建该类的实例。例如: 声明空构造函数可阻止自动生成默认构造函数。注意,如果您不对构造函数使用访问

  • 问题内容: 嘿 语言是Java。我想扩展构造函数具有参数的此类。 这是主要的课程 这是儿童班 如何编写正确的语法?并且错误是“构造函数无法应用于给定类型” 问题答案: 您可以定义构造函数所需的任何参数,但是有必要将超类的一个构造函数作为自己的构造函数的第一行来调用。可以使用或来完成。

  • 问题内容: 为什么将只有私有构造函数的类标记为final是一个好习惯?我的猜测是,要让其他程序员知道它不能被子类化。 问题答案: 将类定为final具有一些(小的)性能提升,因为JIT编译器可以内联该类的功能。我不知道这是否符合“良好做法”的要求,但是我看到了好处。

  • 问题内容: 在春季,bean的类可能没有公共构造函数,而只有私有构造函数吗?创建bean时会调用此私有构造函数吗?谢谢。 问题答案: 是的,Spring可以调用私有构造函数。如果找到具有正确参数的构造函数,无论可见性如何,它将使用反射将其构造函数设置为可访问的。