2017-11-16 8 views
0

実行時に、使用する上位レベルのAPIを決定し、多くの抽象クラスを持ち、上位レベルのAPIごとに派生したクラスとコンテキストクラスこれは(例えば)関数を使用してジョブの正しい派生クラス、と私を提供しています、今の質問は、それはコードがあまり醜いにすることができるような多態性と新しい演算子[C++]

Mesh* genMesh(data d) { if(m_useA_API) return new A_mesh(d); else return B_mesh(d); } 

何かありますか?コンテキストクラス内のメソッドを使用する代わりに、適切な派生クラスインスタンスを返すために基本クラスのnew演算子をオーバーライドできますか?

そうでない場合は、いくつかの解決策はありますか?

TL; DRは、これは私が

Mesh* m = new Mesh(data); // and the base class decides which derived class to use instead of the Context class. 

感謝をしたいと思いますものです。

+0

新しい演算子は、生の記憶域割り当て用です。ファクトリ関数のフックではありません。 – StoryTeller

+0

はい、私は助けのためにstackoverflowに来て、新しいメモリブロックを返します、私はこの問題の解決策があるかどうかを探しています。 – ABOODYFJ

+1

あなたの質問に対する解決策はありません。ファクトリをより効果的に実装するためのさまざまなアプローチや設計パターンがあります。しかし、 'Mesh * m = new Mesh(data)'が 'Mesh'から派生したクラスのインスタンスを指し示す' m'をもたらす解決策はありません。定義上、 'new'式は' Mesh'のインスタンスを生成し、派生クラスのインスタンスは生成しません。 – Peter

答えて

0

あなたは工場としてnewを使用することはできませんが、あなたはそれのための実装パターンを使用することができます。

class Mesh { 
    std::unique_ptr<MeshImpl> _impl; 
public: 
    Mesh(int data) 
    : _impl(
    m_use_A_API 
     ? new A_mesh(data) 
     : new B_mesh(data) 
) { 
    } 
    MeshImpl& get_value() { return *_impl; } 
}; 

クラスA_meshを、B_meshはクラスMeshImplから継承し、正しい方法で初期化されます別のクラスです。

それとも、次の方法で、あなたの工場コードを向上させることができます

  1. は、クラスMesh

  2. の内側にあなたの方法genMesh(int)を移動

    Meshのコンストラクタをプライベートにする、のための誰もがそれを直接呼び出していないことを確認してください。

+0

私は単純な解決策を見逃してしまったようです!どうもありがとう! – ABOODYFJ

+2

生の所有ポインタの代わりに 'std :: unique_ptr'を使います。 (あなたは3/5/0のルールを破ることはありません)。 – Jarod42

+0

'Mesh'のコンストラクタがprivateの場合、派生クラス(' A_Mesh'など)のインスタンスを作成することはできません。派生クラスの構築は、常に基本クラスのコンストラクタを呼び出し/呼び出します。このアプローチを使用すると、派生クラスのコンストラクタが 'Mesh(int)'を呼び出すと、無限再帰が発生します。 – Peter