2016-08-16 12 views
0

C++では高度ではありません。 Aから同じタイプのコンストラクタを使用する(時間が経つにつれて大きくなる)クラスのグループがあるとします。それはこのようになりますと仮定します。C++別のクラスの中で、同じコンストラクターを持つクラスのグループのクラス型変数をインスタンス化します。

class A 
{ 
private: 
    double m_x, m_y; 
public: 
    A(const double &x, double &y, const short &n) { ... }; 
}; 

これらの各クラスは、同じm_x, m_y変数を持っているが、彼らは異なり、それを計算します。今、別のクラスがあります、クラスの前のグループからのコンストラクタを使用する必要があるBlaを、言って、このような何か:

class Bla 
{ 
private: 
    Class m_class; 
public: 
    Bla(const double &x, const double &y, const double &z, const short &i) 
    { 
     switch (i) 
     { 
     case 1: m_class = A::A(...); break; 
     case 2: m_class = B::B(...); break; 
     ... 
     } 
    } 
}; 

コンストラクタでswitch (i)iに応じてグループのコンストラクタのいずれかを選択します。 Bla内のClass m_class変数をコンストラクタ内のswitch (i)と一貫性を持たせるにはどうすればよいですか?どんなタイプの変数を選ぶべきですか?

また、m_classは、グループ内のクラスの1つから来る変数を保持する必要があります。これは別の処理/計算などです。私はこれについて明確に管理することを願っています。

+2

工場機能が必要なようです。 – NathanOliver

+2

まず、 'm_x'と' m_y'を保持する基本共通スーパークラスです。 – Petr

答えて

1

あなたはその後、異なるm_xm_yに移入されますそれぞれのものから、あなたの具体的なクラスを、派生それらの共通のメンバ変数

class I 
{ 
public: 
    virtual ~I() = default; 
protected: 
    double m_x, m_y; 
}; 

とのインターフェースクラスを持つことができます。

class A : public I 
{ 
public: 
    A(const double &x, double &y, const short &n) { ... }; 
}; 

次に、あなたのBlaコンストラクタは、基本的に工場として機能し、あなたは一つの共通クラスからこれらのクラスを派生させることができ、あなたのiパラメータ

class Bla 
{ 
private: 
    std::unique_ptr<I> m_class; 
public: 
    Bla(const double &x, const double &y, const double &z, const short &i) 
    { 
     switch (i) 
     { 
     case 1: m_class = std::unique_ptr<I>(new A(...)); break; 
     case 2: m_class = std::unique_ptr<I>(new B(...)); break; 
     ... 
     } 
    } 
}; 
+0

ありがとうございました。しかし、質問。私は 'unique_ptr'について知らなかった、ちょうどそれについて読んだ。それは、私はそれに 'delete'を使う必要はないと言いますが、これは実行時に頭痛のない動的に使用できることを意味していますか?ポインタのクリーンアップは、私が本当に好きなものではありません... –

+0

デストラクタを含めるように編集しました。私はこれを答えにしました。 –

+0

はい、そうです、 'unique_ptr'は多態的な振る舞いを(つまりインターフェースを使って)得ることができますが、手で何かを削除する必要はありません – CoryKramer

1

に応じて、Iの特定のタイプになります。たとえば:

class Test { 
    double Val1, Val2; 
public: 
    Test() {} 
}; 

class A: public Test { 
    /* constructor and class-specific variables only, 
     don't declare Val1 & Val2 here */ 
} 

その後、Testm_classポインタを作成し、newであなたのswitchのクラスをインスタンス化します。

関連する問題