我正在开发一个小型的roguelike游戏,对于不属于 map 的任何对象/“事物”,都是基于XEntity类的。有几个依赖它的类,例如XPlayer,XItem和XMonster。

我的问题是,当我知道一个对象在item中时,我想将一个指针从XEntity转换为XItem。我用来拾取物品的示例代码是这个,这是当另一个实体拾取它站立的物品时。

void XEntity::PickupItem()
{
    XEntity *Ent = MapList; // Start of a linked list

    while(true)
    {
        if(Ent == NULL) { break; }

        if(Ent->Flags & ENT_ITEM)
        {
            Ent->RemoveEntity(); // Unlink from the map's linked list

            XItem *Item = Ent // Problem is here, type-safety

            // Code to link into inventory is here

            break;
        }

        Ent = Ent->MapList;
    }
}

我的第一个想法是在XEntity中创建一个方法,该方法将自身作为XItem指针返回,但是它创建了无法解决的循环依赖关系。

我对此很困惑。任何帮助是极大的赞赏。

最佳答案

如果您知道XEntity是实际的和XItem,则可以使用静态强制转换。

XItem* Item = static_cast<XItem *>(Ent);

但是,您应该检查设计,看看是否可以以某种方式对实体进行操作,这意味着您不需要知道它是什么派生类型。如果可以为基类提供足够丰富的接口(interface),则可以消除标志检查类型检查。

10-05 18:06