gpt4 book ai didi

c++ - 我可以将一个对象类转换为它在其中实现的接口(interface)指针吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:11:31 25 4
gpt4 key购买 nike

我定义了一个接口(interface)类,如下所示。

class IRecyclableObject
{
public:
virtual ~IRecyclableObject() {}

virtual void recycle() = 0;
virtual void dump() = 0;
virtual int getRecycleTypeID() = 0;
};

下面是我的 CharacterAI 类,它继承了另一个类并实现了上面的接口(interface)类。定义如下。

class CharacterAI : public harp::Character, public harp::IRecyclableObject
{
public:
CharacterAI();
virtual ~CharacterAI();

...

// -- note these 3 virtual functions -- //
virtual void recycle();
virtual void dump();
virtual int getRecycleTypeID();

...
};

接口(interface)中定义的那三个虚函数,我在CharacterAI类中正常实现了。那里没什么特别的。

是时候将它们与ObjectPool(一个自制的)类一起使用,其中可用对象的数据存储在

m_freeList

使用 CCArray 类。

问题出现在下面的代码中。

IRecyclableObject* ObjectPool::popFreeObjectAndAddToActiveListForType(int recycleTypeID)
{
// search from free-list
for(unsigned int i=0; i<m_freeList->count(); i++)
{
IRecyclableObject* obj = (IRecyclableObject*)m_freeList->objectAtIndex(i);
CharacterAI *obj1 = (CharacterAI*)m_freeList->objectAtIndex(i);

CCLog("recycleTypeID : %d %d %d", obj->getRecycleTypeID(), recycleTypeID, obj1->getRecycleTypeID());

...
}
return NULL;
}

预期的结果是显示

recycleTypeID : 4 4 4

但是我得到了

recycleTypeID : 524241408 4 4

第一个显然是垃圾,并且与每个循环随机不同。在返回之前,我尝试在 CharacterAI 类内的已实现函数 getRecycleTypeID() 中放置一个断点。我发现只有

obj1->getRecycleTypeID()

被调用但不是另一个。

通过关注 obj 变量,可以清楚地看到似乎不同的对象调用了该函数,原因可能来自将对象强制转换为接口(interface)类并从那里使用 if 错误或某种。

那里发生了什么?我可以将对象类型类转换为接口(interface)类指针(它实现的)并正确调用接口(interface)类中定义的函数吗?

最佳答案

Can I cast an object class to the interface pointer in which it implements?

是的。但那不是你的情况。函数objectAtIndex()返回指向 CCObject 的指针,并且该类肯定实现IRecyclableObject界面。

因此,CCObject* 的残酷 C 风格转换至 IRecyclableObject*将导致重新解释前一种类型的对象的布局,就好像它是后一种类型的对象一样。这很糟糕,会导致未定义的行为

你应该使用 dynamic_cast<>投出你的CCobject*IRecyclableObject* :

IRecyclableObject* obj = dynamic_cast<IRecyclableObject*>(
m_freeList->objectAtIndex(i)
);

但是请注意,如果您只想将指针最终转换为类型为 CharacterAI 的对象,则甚至不需要这样做.直接将其转换为该类型即可:

CharacterAI* obj = dynamic_cast<CharacterAI*>(m_freeList->objectAtIndex(i));

dynamic_cast<>如果您尝试转换的指针指向的对象的运行时类型不是(等于或派生自)向下转换的目标类型,则返回空指针。因此,在不确定指向对象的具体类型的情况下,不要忘记在取消引用之前检查返回的指针是否为非空。

关于c++ - 我可以将一个对象类转换为它在其中实现的接口(interface)指针吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14923538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com