2016-03-24 7 views
0

を持つベクトルで派生クラスにアクセスします。どちらのクラスも、家、樹木、またはランプを「ビルド/プラント」する方法に関する指示を表すタイプの異なるメンバー変数Instructionを持っています。例えば:異なるオブジェクトを含むベストプラクティス:私は、基本クラス<code>AbstractClass</code>から派生しているように、いくつかのクラス<code>Street</code>、<code>Streetlamp</code>、<code>House</code>と<code>Tree</code>とを、持っている別のメンバ変数やメソッド

class House : public AbstractClass { 
public: 
    Instruction foundation; 
    Instruction walls; 
    Instruction roof; 
}; 

class Tree : public AbstractClass { 
public: 
    Instruction hole; 
}; 

容器vector<AbstractClass*>は、順でそれらを「構築」する要素に含まれる命令を使用しなければならない第三のクラスBuilderに渡されます。 Builderはメソッドvoid buildElement(AbstractClass*)を持つことができ、指示に応じて異なるアクション(「掘る」、「植え付ける」、「運転する」)を実行する必要があります

現在、私はたくさんの)情報には、各オブジェクト内にenum typeを含めて、それが持つタイプを指定します。 この多型のケースをC++で効率的に実装するにはどうすればよいですか? ビジターパターンはここで適用可能ですか?または、私はdynamic_casttypeidのようなRTTIメカニズムを使うべきですか?それとももっと良い方法がありますか?

class AbstractClass { 
public: 
    virtual ~AbstractClass() {} 
    virtual void Build() = 0; 
}; 

class House : public AbstractClass { 
public: 
    Instruction foundation; 
    Instruction walls; 
    Instruction roof; 

    virtual void Build() { 
    // build foundation, walls, and roof as needed... 
    } 
}; 

class Tree : public AbstractClass { 
public: 
    Instruction hole; 
    Instruction plant; 

    virtual void Build() { 
    // dig hole and plant tree as needed... 
    } 
}; 

次に、各オブジェクトの呼び出しvectorBuild()Builder缶ループ:

void Builder::buildElements(std::vector<AbstractClass*> &elements) { 
    for(std::vector<AbstractClass*>::iterator i = elements.begin(); i != elements.end(); ++i) { 
    i->Build(); 
    } 

それとも

+1

オブジェクト指向プログラミングは明らかにあなたの問題を解決ではありません。あなたは抽象的な動作*を持っていませんが、異なるデータしか持たないので、オブジェクト指向多形性を​​適用する有用な方法はありません。 –

+0

まあ、「ハウス」と「ツリー」の意味関係は実際にはどうですか?おそらく、あなたのユースケースを少し具体的に説明し、 'AbstractClass'のように見えるサンプルを与えるべきでしょう。 –

答えて

0

追加抽象Build()方法AbstractClass、必要に応じてAbstractClass実装の各デリバティブBuild()へ:

void buildElement(AbstractClass* element) { 
    element->Build(); 
} 

void Builder::buildElements(std::vector<AbstractClass*> &elements) { 
    std::for_each(elements.begin(), elements.end(), &buildElement); 
} 

または:

void Builder::buildElements(std::vector<AbstractClass*> &elements) { 
    std::for_each(elements.begin(), elements.end(), 
    [](AbstractClass* element) { element->Build(); } 
); 
} 
関連する問題

 関連する問題