2016-10-26 12 views
0

基本クラスの子にプライベートコンストラクタを強制したい。次に、これらのコンストラクタを、ファクトリクラスのフレンドクラスを介して呼び出す必要があります。基本クラスの子にプライベートコンストラクタを適用する方法

class Base: 
    virtual double method1(); 

は私がベースを継承しChildをしたい:Base

class Child::Base : 
    public: 
    Child(string s) { 
     //do something 
    } 

    double method1() { 
      return field1; 
    } 

    private: 
    double field1; 
} 

子供がstringを解析することによって作成されるだろう、私はクラスBaseを持って

:これは私の使用パターンです。だから私はを取るBaseのコンストラクタを持つことができます。しかし、私はコンストラクタを仮想にすることはできないので、パラメータを強制することはできません。

Baseの子は入力stringからしか作成できないように、Baseの子をファクトリクラスからインスタンス化します。私の問題は、誰かがChildを別々にインスタンス化するのを妨げるものは何もないことです。したがって、子どものコンストラクタをBaseに限定してプライベートにしてから、ファクトリクラスをフレンドクラスにしたいと考えています。

アイデア?このデザインに関するコメントさえ歓迎します。

PS:文字列からChildの文字列を取得するには、すべての子供に異なるでしょう。

+0

私は、はっきりあなたの質問のルートを取得していませんか? –

+0

が質問を変更しました。私は単純な例に質問を抽象化しようとしていたが、明らかに私は失敗した。 –

+0

Base privateのデフォルトのコンストラクタにマークを付けることができます。したがって、子コンストラクタは、文字列をパラメータとして呼び出すことを強制されるか、「利用可能なデフォルトコンストラクタを使用できません(C2512)」というエラーが発生します。 –

答えて

2

派生クラスの作成を禁止することができます。派生クラスの作成を禁止することはできますが、コンストラクタを非公開にすることはできません。ただし、強制的に抽象クラスにすることはできません。ここでは作業例です:あなたは、なぜちょうどその基本クラスにフィールド1移動していない「私はベースの子供たちは、常にFIELD1きたい」と言う場合

class A 
{ 
    private: 
     struct secret{}; 
     virtual void impossible(secret) = 0; // cannot override this in subclasses 
              // because the parameter type is private 

     template <class X> class AImpl : public X 
     { 
      void impossible(secret) {}; // a nested class can access private members 
     }; 

     template<class X> friend X * AFactory(); 

    public: 
     virtual ~A() {} 
}; 

class B : public A 
{ 
    // void impossible(A::secret) {}; -- can't do that, A::secret is private! 
}; 

template <class X> 
X * AFactory() 
{ 
    return new A::AImpl<X>; 
}; 

int main() 
{ 
    // B b; -- can't do that, B is abstract! 
    B* pB = AFactory<B>(); // Ok 
} 
関連する問題