したがって、基本クラスのポインターのリストがあります。
list<Base*> stuff;
次に、ある時点で、オブジェクトの 1 つが他のすべてのオブジェクトを調べます。
Base * obj = ...; // A pointer from the 'stuff'-list.
for (list<Base*>::iterator it = stuff.begin(); it != stuff.end(); it++)
{
if (obj == *it)
continue;
// Problem scenario is here
obj->interact(it);
}
私が達成したいのは、派生型obj
とが何であるかに応じて*it
、それらが互いに異なる相互作用DerivedA
をすることです。次のようなものです:DerivedB
DerivedB
bool c = true;
struct Base
{
virtual void interact(Base * b); // is always called
};
struct DerivedA : public Base
{
virtual void interact(Base * b){} // is never called
virtual void interact(DerivedB * b) // is never called
{
if (b->c)
delete this;
}
};
struct DerivedB : public Base
{
bool c = false;
virtual void interact(Base * b){} // is never called
virtual void interact(DerivedA * a) // is never called
{
c = true;
}
};
// and many many more Derived classes with many many more specific behaviors.
コンパイル時には、それらは両方ともBase
-pointers であり、互いに呼び出すことができず、型が魔法のように現れることを期待できません。これが一方通行の関係である場合、つまり、そのうちの 1 つのタイプがわかっている場合は、Visitor パターンを使用できます。ある種のメディエーターパターンを使用する必要があると思いますが、メディエーターもポインターを保持するため、違いが生じないため、実際にどのように理解することができませんBase
。
続行する方法についての手がかりがありません... 誰か?
バックグラウンド:
私はゲームを作成しています。この問題は、ゲームの内容、つまり現在部屋にあるRoom
ものを追跡するクラスに起因しています。GameObject
オブジェクトが移動することがあります (たとえば、プレーヤー)。部屋は、すぐに移動される床タイル (上記のループ) にあるすべてのオブジェクトをループし、オブジェクトが互いに相互作用するかどうかを確認します。
たとえば、それTroll
をPlayer
傷つけたい場合。または、彼は、別の「チーム」(関数からアクセスでき、すべてが実装されている)に由来するCharacter
(Troll
とPlayer
から派生した)を傷つけたいだけです。Character
getAlignment()
Characters