【问题标题】:How to add a base class to a vector of derived classes如何将基类添加到派生类的向量中
【发布时间】:2013-04-12 11:36:40
【问题描述】:

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

【问题讨论】:

  • 你为什么要这样做。从基类转换为派生类是不行的……除非你知道基类是派生类,但这可能表明设计不好。
  • 就个人而言,我在这里看到了一个设计缺陷。

标签: c++ pointers casting


【解决方案1】:

如果你的CDerivedClass::AddComponent函数只能真正处理cDerivedClassPtrs,那么相应地调整它的签名:

CDerivedClass::AddComponent(cDerivedClassPtr inpDerivedClass)

如果应该可以处理cBaseClassPtr,那么调整vDerivedPtrList的定义保持cBaseClassPtrs:

std::vector<cBaseClassPtr> vBasePtrList;

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-23
      • 1970-01-01
      • 2016-03-30
      • 2014-04-24
      • 2017-02-06
      • 2019-02-17
      • 2021-09-27
      • 2020-08-30
      • 2021-11-26
      相关资源
      最近更新 更多