我有一个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
答案 0 :(得分:0)
如果您的CDerivedClass::AddComponent
功能只能真正处理cDerivedClassPtr
,请相应调整其签名:
CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)
如果它应该能够处理cBaseClassPtr
,那么请调整vDerivedPtrList
的定义以保留cBaseClassPtr
s:
std::vector<cBaseClassPtr> vBasePtrList;
答案 1 :(得分:0)
很难确切地知道你在这里要做什么,以及你正在使用什么智能指针实现。
为什么你的基类不是多态的?如果是这样的话,你可以使用某种双重调度将它自己添加到适当的集合中。
如果每个派生都有不同的向量,那么每个派生类都会知道它应该添加到哪一个。
你需要你的基类派生自enable_shared_From_this所以它可以共享指针本身,如果它当前已经是shared_ptred(可能是它):虽然这将shared_ptr本身变成基类型,然后你可以创建另一个shared_ptr基于第一个的生命,把它放在收藏中。
(假设您使用的是boost,我认为std具有相同的界面)