繁体   English   中英

如何将基类添加到派生类的向量中

[英]How to add a base class to a vector of derived classes

我有一个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

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

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)

如果应该能够处理cBaseClassPtr ,则调整vDerivedPtrList的定义以容纳cBaseClassPtr

std::vector<cBaseClassPtr> vBasePtrList;

很难确切知道您要在此处执行的操作以及正在使用的智能指针实现。

为什么您的基类不是多态的? 如果是这样,则可以使用某种双调度将其添加到适当的集合中。

如果每个派生都有不同的向量,则每个派生类将知道应该将其自身添加到哪个派生类。

您将需要您的基类从enable_shared_From_this派生,以便它可以共享指针本身(如果当前已经是shared_ptred(大概是)):尽管这会将shared_ptr本身转换为基类型,然后您可以根据其寿命创建另一个shared_ptr首先将其放入收藏夹中。

(这是假设您正在使用boost,我认为std具有相同的接口)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM