2011-01-19 9 views
1

誰かが私を助けることができるかどうか疑問に思っていました。デザインパターンのアドバイス

は、次のように私はいくつかのクラスがあるとします。

今私は、クラスBがメンバーとしてタイプFのオブジェクトを持っているメンバーとクラスCとタイプEのオブジェクトを持っていると思います。

クラスAのクラスDに何らかの種類の基本ポインタを持たせ、クラスBの新しいEとクラスCの新しいFを作成することができます。抽象的なファクトリが似ているのか疑問に思っていました?

これはあまり混乱しないことを願っています... UML図なしで説明するのは難しいです。

+0

コードをフォーマットしました。将来の投稿でこれを自分で行ってください。 –

+1

あなたのデザインを再考する必要があります。 – Falmarri

+0

申し訳ありませんが、ジョンさんが行います。 – Mewzer

答えて

2

あなたが言っている通りに正確にやっているのは何ですか?

class A 
{ 
    A(D* p) : ptr(p) {} 
    D* ptr; 
}; 

class B : public A 
{ 
    B() : A(new E) {} 
}; 

class C : public A 
{ 
    C() : A(new F) {} 
}; 

さらに自動化したい場合は、中間のテンプレートクラスを使用できます。 AImpl::getD()が原因covariant return typesT*を返すことができることを

class A 
{ 
    virtual D* getD(); 
}; 

template <class T> 
class AImpl : public A 
{ 
    AImpl() : m_d(new T) {} 
    T* getD() { return m_d; } 
    T* m_d; 
}; 

class B : public AImpl<E> { }; 

class C : public AImpl<F> { }; 

は注意してください。

+1

これはCRTPではありません。 CRTPとは、基本として使用されるクラステンプレートにテンプレートパラメータとしてクラス自体を提供することを意味します。あなたは、ベースとして使用されるクラステンプレートにテンプレートパラメータとして他のクラスを提供しています。 –

+0

ええ、ええ、あなたが正しいです。何らかの理由で私にはCRTPのように思えましたが、私はそれについても考えませんでした。私はそれを修正します。乾杯。 –

2

あなたはまさにそれを行うことができます。

class D 
{ 
public: 
    D(const A *p) : p_(p) {} 
    virtual ~D() { delete p_; } 
private: 
    const A *p_; 
}; 

class E : public D 
{ 
public: 
    E() : D(new B) {} 
}; 

はあなたが達成しようとしているものに応じてこれまでより優れた多くのアプローチがあります。例えば、DにはAへのポインタを入れる必要があるのはなぜですか?

おそらくあなたの目標をよりよく説明するために質問を編集すると、より洞察力のある回答を提供することができます。

+0

Falmarriは私のデザインを再考すべきだと言った。上記は良い習慣であると思いますか、別のアプローチをお勧めしますか? – Mewzer

+0

@Mewzer:私はあなたの目標が何であるか分からないので、私は言うことができません。 –

+1

コード内のDからEの導出が欠けていますか? – bjskishore123