0

我有一个std::vector指向派生类的cDerivedClass共享指针,我也有基类的共享指针。所以是这样的:

typedef SHARED_PTR<cBaseClass> cBaseClassPtr;

typedef SHARED_PTR<cDerivedClass> cDerivedClassPtr;

std::vector<cDerivedClassPtr> vDerivedPtrList;

现在,如果我想要一个CDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)方法接受 cBaseClassPtr 类型的参数并将其添加到派生类的向量 (vDerivedPtrList) 中,我该怎么做呢?

我知道 dynamic_cast 不起作用,因为除非基类是多态的,否则动态转换不允许基到派生的转换。我尝试将 cBaseClassPtr 静态转换为 cDerivedClassPtr,但我抛出了一个错误。

void cDerivedClass::AddComponent(cBaseClassPtr inpBaseClass)
{
    MY_ASSERT(inpBaseClass, "Component cannot be NULL");

    cDerivedClassPtr pDerviedPtrToAdd = static_cast<cDerivedClassPtr>(inpBaseClass);

    this->mvComponentList.push_back(pDerviedPtrToAdd);
}

编辑:确切地说,这是我得到的错误:

No matching conversion of static_cast from 'cBaseClassPtr' (aka 'shared_ptr<cBaseClassPtr>') to 'cDerivedClassPtr' (aka 'shared_ptr<cDerivedClassPtr>');

我正在使用 boost 的智能指针实现boost::shared_ptr

4

2 回答 2

0

很难确切地知道您在这里尝试做什么,以及您正在使用什么智能指针实现。

为什么你的基类不是多态的?如果是这样,您可以使用某种双重调度来让它自己添加到适当的集合中。

如果每个派生都有不同的向量,那么每个派生类都会知道应该将自己添加到哪个向量。

您将需要您的基类从 enable_shared_From_this 派生,因此如果它当前已经是 shared_ptred (大概是这样),它可以共享指针本身:尽管这会将 shared_ptr 本身转换为基类型,然后您可以根据生命周期创建另一个 shared_ptr第一个并将其放入集合中。

(假设您使用的是 boost 并且我认为 std 具有相同的接口)

于 2013-04-12T11:57:03.780 回答
0

如果您的CDerivedClass::AddComponent函数只能真正处理cDerivedClassPtrs,则相应地调整其签名:

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)

如果它应该能够处理cBaseClassPtr,则调整 的定义vDerivedPtrList以保持cBaseClassPtrs :

std::vector<cBaseClassPtr> vBasePtrList;
于 2013-04-12T11:42:39.357 回答