これは、私が最近抱えているいくつかのニーズをどのように実装するかについての質問です。これにはパターンまたは一般的な解決策があると確信しており、私はそれを持ってきましたが、もっと学びたいと思っています.
ゲーム自体に関連するすべてのエンティティがクラス「アクター」(「障害物」、「動く障害物」、「発射物」、「大砲」など) から派生するゲームで作業しているとします。ゲームでは、これらのエンティティはすべてstd::vector<Actor *>
ベクトルに格納されるため、トラバースできます。
ここで、各「Actor」が各ターンで何かを「実行」できると仮定し、メソッド「act」を与えてみましょう。Obstacle::act はほとんど何もしません。Moving_obstacle::act と Projectile::act はそれらを動かし、"Cannon::act" は新しい発射物を作成します。純粋な仮想関数 Actor::act を用意するのは理にかなっているので、次のようなことができます。
std::vector<Actor *>::iterator b=myvectorofactors.begin(), e=myvectorofactors.end();
while(b < e)
{
*b->act();
b++;
}
そして、それらすべてを「演技」させます。まあ、これまでのところとても良いです...問題は、Cannon::act が異なるプロトタイプまたは戻り値を持つ可能性があることです (たとえば、生成された発射体を格納し、それをベクトルにプッシュするために)、この 1 つの「小さな」違いすべてを壊します。
さて、ある観点から、これらのメソッドのオーバーロードはそれぞれ完全に異なる関数であることを知っています。また、事前に計画を立て、十分な洞察力を持って問題を解決できることも知っています... または、問題を回避することもできます。
このケースでは、派生した Actor クラスごとに異なる一意の識別子を使用し、それらを使用して対応するクラスにキャストし、それらを回避しました。私は再び同じ問題に遭遇すると確信しており、いくつかのエントリーレベルの解決策について知りたいと思っています.
お時間をいただきありがとうございます。