所以,我有一个基类指针列表:
list<Base*> stuff;
然后,在某个时候,其中一个对象将查看所有其他对象。
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 并且不能互相调用并期望类型神奇地出现。如果这是一种单向关系,即我知道其中一种是什么类型,我可以使用访问者模式。我相信我应该使用某种Mediator 模式,但无法真正弄清楚如何因为 mediator 也将持有Base
-pointers,因此它不会有所作为。
我不知道如何继续……有人吗?
背景:
我正在创建一个游戏,这个问题源于Room
跟踪它的内容的类,即GameObject
房间里当前有什么。
有时,一个物体会移动(例如,玩家)。然后房间将遍历即将移动的地砖上的所有对象(上面的循环),并检查对象是否会相互交互。
例如,如果它是一个Troll
想要Player
伤害它的人。或者他只是想伤害来自任何另一个“团队”(可以从所有实现的函数访问)的任何Character
(两者Troll
都Player
来自)。Character
getAlignment()
Characters