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.
 }

親の getInstance() を呼び出すSubClass::getInstance()を使用します。SubClass の静的メソッドのみを使用します (したがって、SubClass をインスタンス化する必要はありません)。

だから私の問題は、コンパイル時に警告が表示されることです-

「基本クラスのデストラクタにアクセスできないため、サブクラス: デストラクタを生成できませんでした」。

これらの警告を取り除きたいのですが、この設計がシングルトン設計パターンに違反していることも知りたいですか?


達成したいこと

アプリケーション用のロガーを作成しています。サードパーティ ライブラリのロガー クラス (QxtCore ライブラリの QxtLogger) を使用しています。この QxtLogger クラスはシングルトンであり、コンストラクターとデストラクターがプライベートです。QxtLogger が持っているすべてのメソッドといくつかの追加の静的メソッド (私のアプリケーションに固有のもの) を持つシングルトン クラスが必要です。

そこで、QxtLogger を継承するクラスを作成し、いくつかの静的メソッドを追加しました。私が心配しているのは、警告を生成しているシングルトン クラスを拡張することです (基本クラスのコンストラクタとデストラクタにアクセスできないため)。それで、私は何をすべきですか?

4

2 に答える 2

6

コンストラクターが表示されていないクラスを拡張することはできません。それがクラス設計者の意図でした。

クラスを拡張したい場合は、コンストラクタ/デストラクタを作成していたでしょうprotected

継承の代わりに構成を使用することをお勧めします。

于 2012-05-03T08:44:41.280 に答える
2

止まる!

シングルトンアンチパターンの疑わしい使用(もう一度)に加えて、C++はJavaではないことを覚えておく必要があります。

結果として、クラスの機能を拡張するための継承よりも優れた方法があります。それは、free-functionsです。

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

int extend2(Singleton const& s);

これらの関数は、Singleton次の2つの理由で参照によりクラスを取得することに注意してください。

  • 彼らがそれに依存していることが明らかになります
  • シングルトンネスを取り除くときのために、それはリファクタリングへの道を開きます
于 2012-05-03T09:06:37.633 に答える