English 中文(简体)
把一个基类的点子变成一个继承的类别
原标题:Converting a pointer for a base class into an inherited class

从事小规模的不法游戏,为不属于该地图一部分的任何物体/“th”而工作的人,都属于XEntity类。 有几个班级,如XPlayer、XItem和XMonster。

我的问题是,如果我知道某个物体是物品,我想把一个点从XEntity改为十一tem。 我在选择一个项目时使用的样本代码是这样,正好是,一个不同的实体拿到了它所继承的项目。

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中形成一种方法,将自己作为十一点点点点,但这种方法会产生无法解决的循环依赖性。

我很忙于这样做。 非常感谢任何帮助。

最佳回答

know:XEntity is actuall and 第十一条项目后,您可使用静态投射物。

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

但是,你应当审查你的设计,看看你是否能够在实体内运作,这意味着你不需要知道哪类来源。 如果你能够给基类一个足够丰富的接口,你就可以取消对旗帜的检查类型。

问题回答

正如其他人所指出的:

// dynamic_cast validates that the cast is possible. It requires RTTI 
// (runtime type identification) to work. It will return NULL if the 
// cast is not possible.
XItem* Item = dynamic_cast<XItem*>(Ent);
if(Item)
{
    // Do whatever you want with the Item.
}
else
{
    // Possibly error handling code as Ent is not an Item.
}

但 我认为,你可以退步,看看方案的设计,因为降幅是适当面向目标的设计应当而且可以避免的。 一种强大的工具,即使是一种比喻的复杂工具,也可能是Visitor patterns

我曾经认为,总是有可能用“适当”设计来避免降水。 只是这种情况。 适当的设计往往需要有分目标来实施新的而不是不同的行为。 “适当”设计的倡导者经常会告诉你,新的行为把抽象行为推向属于其所属的地方。 并非总是如此,但如果你不断设法确保从最抽象的角度来看能够使用你的所有课程,那么,情况往往会结束,而且只是很.。

以集中方式处理缩编问题的一个重大办法是利用访客模式。 有一些访问形式,但有些需要缩减,有些则没有。 专才访问者,也就是需要缩减的访客,更容易与我合作,而且从我的经验来看,更强大。

另一名来访者称“合作访问者”。 它仍然 cast,它只是以更快的方式,自食其力。 我没有尝试过合作访问者的原因是,我没有找到办法,使它在多个高层次上工作......但是,我没有花很多时间去做,要么是因为我(在我目前的项目中) with了自己。

合作访问者的真实冷却是返回类型。 然而,我利用我的来访者参观了全部物体,并与他们做事。 我难以设想回返将如何在这些情况下发挥作用。

标准访问者还只是通过虚拟电话机制这样做的,这种机制比明确显示的更快,有时更安全。 我不喜欢这位访问者的话是,如果你需要访问威得克族高校的WidgetX,那么,即使你不关心他们,你也必须为WidgetY和WidgetZ进行访问。 随着大型和(或)较广的省份,这可以成为一家私营军保公司。 其他选择不需要这样做。

还有一个“高级访问者”。 它知道何时结束。

如果你不倾向于使用访客,而只是希望投放,那么你可能会考虑利用这一推动力:无吗? 它有安全、警示机制,在禁忌的建筑中,有动力,释放的速度也加快。 可能没有必要。 有时,你刚刚知道你重新投了权利。

你们需要思考和想避免的重要事情正在打破低价竞标。 如果你有“如果(植被和大体;类型)=类型1”的整批代码,那么如果(植被和大体;类型)=类型2,则添加新的植被类型是一个大问题,对许多代码的影响是坏的。 你的新植被确实是一种 w子,因为你们的所有客户都与你的高层次关系过密切,而且不知道。 访客的格局并没有消除这一问题,但它确实是集中的,当你揭穿坏的轮.时,这一点非常重要,而且常常使它更简单地处理。

赞成:

XItem* Item = (XItem*)Ent;

整体而言,更好的办法是:

if (XItem *Item = dynamic_cast<XItem*>(Ent)) {
    Ent->RemoveEntity();

    // Code to link into inventory is here

    break;
}
XItem * Item = dynamic_cast< XItem * >( Ent );

if ( Item )
    // do something with item

为此,你需要使RTTI能够发挥作用。 查阅here,以供参考。

得到答复的有2名运营商:

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

而且:

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

第二种是缓慢但更安全的(如果可能的话进行自我检查),即使有<密码>,也可能退回无效。 不适用。

我倾向于采用两种方法:

template <class T, class U>
T* my_cast(U* item)
{
#ifdef _NDEBUG_
  if (item) return &dynamic_cast<T&>(*item); // throw std::bad_cast
  else return 0;
#else
  return static_cast<T*>(item);
#endif
}

这样,我就可以在发展时进行打字检查(如果情况不好,则例外),在我完成学业时,我会加快速度。 如果你愿意,你可以采用其他战略,但我必须承认我这样做:





相关问题
Undefined reference

I m getting this linker error. I know a way around it, but it s bugging me because another part of the project s linking fine and it s designed almost identically. First, I have namespace LCD. Then I ...

C++ Equivalent of Tidy

Is there an equivalent to tidy for HTML code for C++? I have searched on the internet, but I find nothing but C++ wrappers for tidy, etc... I think the keyword tidy is what has me hung up. I am ...

Template Classes in C++ ... a required skill set?

I m new to C++ and am wondering how much time I should invest in learning how to implement template classes. Are they widely used in industry, or is this something I should move through quickly?

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

typedef ing STL wstring

Why is it when i do the following i get errors when relating to with wchar_t? namespace Foo { typedef std::wstring String; } Now i declare all my strings as Foo::String through out the program, ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

Window iconification status via Xlib

Is it possible to check with the means of pure X11/Xlib only whether the given window is iconified/minimized, and, if it is, how?