2013-06-12 13 views
6

これは、最近私が行ってきたいくつかのニーズを実装する方法に関する質問です。私はこれにパターンや共通の解決策があると確信しています。私が1つ一緒に来ても、もっと学びたいと思っています。異なるパラメータを持つ派生クラスのC++メソッド

ゲームに関連するすべてのエンティティが「アクター」(「障害物」、「移動障害物」、「発射物」、「大砲」など)のクラスから派生したゲームで作業しているとします。ゲームでは、これらのエンティティはすべてstd::vector<Actor *>ベクタに格納されているため、これらのエンティティは通過できます。

ここで、各 "俳優"がそれぞれのターンで何かを "行う"ことができ、それらにメソッド "行為"を与えようとしましょう。 Obstacle :: actはほとんど動かず、Moving_obstacle :: actとProjectile :: actはそれらを移動させ、「Cannon :: act」は新しい発射物を作成します。 「演技」

std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end(); 
while(b < e) 
{ 
    *b->act(); 
    b++; 
} 

そしてそれらすべてを持っている:それは一種の私が順番にような何かを行うことができますので、行動::純粋仮想関数の俳優を持っていることは理にかなっています。さて、これまでのところとても良い...事は、Cannon :: actは異なるプロトタイプまたは戻り値を持つことができます(たとえば、生成された発射体を格納して、ベクトルにプッシュした)それをすべて破ります。

ここで、特定の観点から、これらのメソッドのオーバーロードは完全に異なる機能であることがわかりました。私はまた、誰もが常に事前に計画し、十分な先見性で問題を解決することができることを知っている...または誰かが問題を回避することができます。

この場合、派生したActorクラスごとに異なる一意の識別子を使用し、それらを使用して対応するクラスにキャストし、それらを回避します。私は再び同じ問題を抱えることになると確信しています。私はいくつかのエントリーレベルの解決策について知りたいと思っています。

お時間をいただきありがとうございます。

+0

少ない壁、より多くのサンプルコードは、 – David

+3

は@Daveに同意することはできませんしてください、それもです思考の質問。 – Nick

+0

[訪問者パターン](http://en.wikipedia.org/wiki/Visitor_pattern)をご覧ください。 – Nick

答えて

3

開始が音であるに取得しないように、あなたはここで脱線:

事がある、キャノンは::行為(たとえば異なるプロトタイプや戻り値を持つことができ、生成された発射体を格納し、それをベクターにプッシュしておく)

なぜでしょうか?行為は行為です。インスタンスは何もせずにそれを把握しなければなりません。行動する前に、あなたはそれを訓練しなければなりません。あるいは、法案の中で見て回らなければならない。

考えてみましょう:あなたが魔法のように、異なるパラメータのペイロードを用意していても、どのように見積もられるのですか?呼び出しは抽象です。あなたがdynamic_castで感染したとしても、大砲がどんなパラメータを取得するかという問題を残していますか?

いいえ、対象者が互いに協力し、または(ディスパッチャを参照)、いくつかのメッセージングシステムを使用する必要があります...テキストの

+0

メッセージングシステムは、私が別のプロジェクトで使用したものです。 (私はコードを見るたびにたくさんのことがわかりましたが)他の方法でそれを訓練することは考えていませんでした。将来のプロジェクトでいくつか考えていきます。ありがとう。 –

+0

回答としてマークされています。どんなコメントも役に立たなかったのではなく、 "Act is act"のビットが本当に私を得ました。ちょうど私は間違った継承全体を解体し、ゲームコントローラとActorサブクラスで、それぞれの特定のケース(撮影、他のアクターの動き、または他のもの)を扱うためのさまざまなメソッドを書きました。 whats_my_type_idメソッドを使用するクラス間の区別は、醜いですが、このプロジェクトでは十分です。 –

1

それぞれの行為の本体が異なる内部的に所有された/継承された変数を使用できる内部変数。したがって、actを呼び出す前にこれらの変数を設定することができます。パラメータは、安全のために、または合併症

+0

お返事ありがとうございました...私は新しい「発射物」を追加したいと思っています:まあ、私はどこかからそれを返すか、または私が書き込むための参照/ポインタを渡すべきです...私はできると思います問題はありませんが、もう一度、 "Actor"クラスのstatic_castingを終了して、これらの準備メソッドを呼び出すことができます。それについてのアイデア? –

+0

基本クラスからポインタパラメータを使って、関心のあるインスタンスだけが使用し、nullを送信することができます。返す必要はありません。 – aah134

+0

これは実際に "キャノン"クラスにあったものです。正常に実行されたときにポインタに書き込むと、メインコントローラは何かがそのポインタにあってアクタベクトルに挿入できるかどうかをチェックします...しかし、もっと多くの型のパラメータが必要でした。ありがたいことに私はすでにそれを解決しました。上記のコメントを見てください。 –

関連する問題