2017-10-30 3 views
0

私は複数の基本クラスから派生したクラスを持っています。問題は、派生クラスと基本クラスはデフォルトのコンストラクタを使用せず、引数を取るので、私はどのように管理できるのか混乱しています。私はコンストラクタであったはずのものに引数を渡すことができるようにしたいですが、私は一度行うことができます(私はそれがセッターになりたくない)。私の唯一の解決策は、派生クラスのgetInstance()メンバーの静的なブール値でした。デフォルト以外のコンストラクタの複数のベースを持つシングルトン派生クラス

基本ケース:それはシングルトンのようにする

//Singleton Derived Class with multiple bases of non-default constructors 
class base1 { 
    public: 
     base1(int* value) : 
       val_{value} {;} 
     ~base1(); 
    private: 
     int val_; 
} 

class base2 { 
    public: 
     base2(int* value) : 
       val_{value} {;} 
     ~base2(); 
    private: 
     int val_;  
} 

class derived : public base1, public base2 { 
    public: 
     derived(int* value) : 
       base1{value}, //Base 1 constructor call 
       base2{value}, //Base 2 constructor call 
       val_{value} {;} 
     ~derived(); 
    private: 
     int val_; 
} 

//Creation 
derived newDerived(&value); 

試み?

//Lets make it a singleton 
class base1 { 
    public: 
     base1(); //Can I pass the construtor anything? 
     ~base1(); 
    private: 
     int val_; 
} 

class base2 { 
    public: 
     base2(); //Can I pass the construtor anything? 
     ~base2(); 
    private: 
     int val_;  
} 

class derived : public base1, public base2 { 
    public: 
     static derived& getInstance(int* value) { 
      static bool init; 
      if (!init) { 
       base1::val_ = value; 
       base2::val_ = value; 
       init=true; 
      } 
      static derived instance; 
      return instance; 
     } 
     derived(int* value) {;} 
     ~derived(); 
    private: 
     derived(derived const&) = delete;   //Copy construct 
     derived(derived&&) = delete;    //Move construct 
     derived& operator=(derived const&) = delete;//Copy assign 
     derived& operator=(derived &&) = delete; //Move assign 
     int val_; 
} 

//Creation 
derived::getInstance(&value); 

私はこのことについて行かなければならない、または多分理由は私がすべてでそれを行うべきではありませんどのようにいくつかの方向を探していますか?ありがとう

+1

このシングルトンのコンストラクタに渡します。それを静的ローカル変数として格納するのは良い考えではありません。デフォルトのコンストラクタを使用してインスタンスを作成するだけでなく、インスタンスの存続期間を制御することもできます。 – VTT

+0

Mayne私は思考を超えています。これが遅延初期化を使用する場合、私は 'int * value'を派生したコンストラクタに渡して、そのまま残しておくことができます。 – DrTarr

+0

なぜシングルトンが必要ですか? – Jarod42

答えて

1

ここに行きます。参照の代わりにここでポインタを使用しています。これは単なる例なので、私はこのシングルトンをスレッドセーフとしては作っていません。また、インスタンス化できないように、デフォルトのコンストラクタをprivateとして宣言します。

class base1 { 
public: 
    base1(int* value) : val_(*value) {} 
    ~base1() {}; 
    private: 
     int val_; 
}; 

class base2 { 
public: 
    base2(int* value) : 
    val_(*value) { } 
    ~base2() {}; 
private: 
    int val_; 
}; 

class derived : public base1, public base2 { 
    private: 
    derived(int* value) : 
    base1(value), //Base 1 constructor call 
    base2(value), //Base 2 constructor call 
    val_(*value) {} 
    ~derived() {}; 
    private: 
    int val_; 
    static derived* driv; 

    public: 
    static derived* getInstance(int* value); 
}; 

derived* derived::driv = NULL; 

derived* derived::getInstance(int* value) 
{ 
    if (driv == NULL) 
    { 
     driv = new derived(value); 
    } 
    return driv; 
} 
+0

いいね、ありがとう。私は、私はポインタ/参照メソッドの側面を理解していないと思う、私はまだ明示的にコピーを削除する必要があります/ assigment/moveコンストラクタ、右か? – DrTarr

+0

メモリを解放するには、基本クラスのデストラクタを利用するだけです。シングルトンクラスのメモリを解放する方法については、オンラインドキュメントを参照してください。 –

関連する問題