抽象类的shared_ptr向量到副本向量

2024-03-11

我有一个带有共享指针的向量:

std::vector<std::shared_ptr<DescriptorsNs::Descriptor> > mDescriptorList;

现在我想要一个 getter 函数,它返回一个包含这些对象副本的向量:

void CatUpdater::getDescriptorList(std::vector<Descriptor*>& descriptorList) const
{
    descriptorList.clear();
    for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
    {
        descriptorList.push_back(*it);
    }
}

现在的问题是 Descriptor 是一个抽象类,当我尝试将它们添加到向量中时,它正确地指出:

/usr/include/c++/4.7/ext/new_allocator.h|110|error: cannot allocate an object of abstract type ‘DescriptorsNs::Descriptor’|

我可以通过尝试解决这个问题std::dynamic_pointer_cast对于所有类型的派生类,但应该有一种更简单的方法来实现这一点。

谁能告诉我一种将原始对象复制到返回向量的更好方法?


您不能创建 Descriptor 对象,因为它是抽象的。

但是您可以制作指向这些对象的指针的深层副本。

为此,您的班级描述符丢失clone虚拟方法!

将其添加到您的类中并在您的派生类中正确实现。

class Descriptor {
 ...
  virtual Descriptor* clone() const = 0;
};


class SomeDescriptor : public Descriptor {
 ...
  virtual Descriptor* clone() const { return new SomeDescriptor (*this); }
};

并在将一个向量深度复制到另一个向量时使用clone():

void CatUpdater::getDescriptorList(std::vector<std::shared_ptr<DescriptorsNs::Descriptor> >& descriptorList) const
{
    descriptorList.clear();
    descriptorList.reserve(mDescriptorList.size());
    for (auto it = mDescriptorList.begin(); it != mDescriptorList.end(); it++)
    {
        descriptorList.push_back((*it)->clone());
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

抽象类的shared_ptr向量到副本向量 的相关文章

随机推荐

  • 在Google云平台上使用FFMPEG

    我将音频文件存储在 Google Cloud Storage 上 通过 Firebase 存储 我需要使用 FFMPEG 将音频文件从立体声 两个通道 转换为单声道 一个通道 如何在 Google Cloud Platform 上进行上述转
  • java.io.IOException:不支持标记/重置

    我知道这个问题已经被问过很多次了 但在某些情况下有所不同 所以我无法弄清楚 当我在 Eclipse 中运行游戏时 一切都很顺利 游戏运行完美 但在导出后 它崩溃了 我可以打开游戏并在菜单中移动 但没有播放任何声音 并且在我点击播放后 游戏就
  • 查找数组中第一个非零值索引

    我有一个数组数组 0 0 0 0 3 2 5 6 15 9 0 0 7 23 我可以用类似的东西 indexOf 0 如果我想找到第一个零值索引 但是如何找到第一个非零值的索引或符合某些条件的索引 它可能看起来像 indexOf funct
  • 从 contentViewController 中解除 UIPopoverController?

    如果您想关闭弹出窗口 例如 从弹出窗口的 contentViewController 中的按钮 您必须 创建对弹出窗口的引用 该引用由创建它的视图控制器保存 从 contentViewController 创建一个通知 让所属视图控制器知道
  • 在 VB.net 中将竖线分隔文件更改为逗号分隔

    所以我有一组管道分隔的输入 如下所示 787291 3224325523 37826427 37826427 2482472 2482472 46284729 46246 24682 82524 6846419 68247 我使用下面给出的
  • 干扰器 helloworld 示例

    我想学习颠覆者框架 http code google com p disruptor 谁能给我一个用Java语言在main方法中运行的helloworld例子 这是一个简单的 可运行的示例 说明如何使用 Disruptor 库 示例是使用
  • 卸载 oh-my-zsh 时遇到问题?

    我在 OSX 上 想要切换回原来的 zsh 配置哦我的zsh http github com robbyrussell oh my zsh 但是当我运行uninstall脚本它给了我一个错误 sudo uninstall oh my zsh
  • dxDataGrid - 如何刷新小部件

    当我单击按钮时 刷新不起作用 如果目的是添加到数据库按钮 请按按钮进入屏幕 但就是不更新 我用ajax创建了一个数据网格 我也在ViewModel中写了刷新功能 不刷新可能是什么原因 我的数据是json ajax type GET url
  • 如何使用python中的lambda函数在通过S3连接的AWS athena中进行查询

    我将 csv 文件保存在 S3 存储桶中 我可以使用AWS Athena查询S3的数据 有什么方法可以将 lambda 函数连接到 athena 并从 lambda 函数查询数据 请帮忙 Thanks 正如 Chris Pollard 所说
  • 如何捕捉Tk中的最大化信号?

    您可以通过以下方式将命令与窗口的 X 按钮绑定 wm protocol windowPath WM DELETE WINDOW command 如何对窗口的最大化按钮执行相同的操作 X11 中也没有标准协议ICCCM套 http tronc
  • HTML 选择选项文本等宽

    我正在尝试选择使用等宽字体的选项 以便当您单击下拉菜单时它们会垂直排列 我试图将代码左对齐 后跟破折号 然后是描述 我使用编码空格添加了选项 以便每个选项在破折号之前具有相同数量的字符 但它们仍然没有对齐 我尝试了新的快递和等宽字体 我可以
  • php中相应的嵌套三元运算符? [复制]

    这个问题在这里已经有答案了 我想转换以下if else condition to nested ternary操作员 if projectURL echo projectURL elseif project project url echo
  • 如何知道php邮件发送失败

    我正在从 php mail 发送邮件 如果发送到目的地失败 我希望收到失败消息 to email protected cdn cgi l email protection email from email protected cdn cgi
  • net::ERR_ABORTED 429 仅通过本地主机使用 ipinfo.io

    我想从前端设备获取 IP 地址 我发现this https ipinfo io developers名为 IPINFO io 的免费 API 根据使用 Jquery 获取 IP 地址的文档 我需要做的就是 get https ipinfo
  • 如何在网络驱动程序中检查页面是否已完全加载?

    我正在编写一些 Java Webdriver 代码来自动化我的应用程序 如何正确判断页面是否已加载 该应用程序也有一些 Ajax 调用 我已经声明了对 WebDriver 的隐式等待 硒会为你做到这一点 或者至少它尽力了 有时它会达不到要求
  • 使用 sse 内在函数时如何打破循环?

    m128 pSrc1 m128 string m128 m0 mm set ps1 0 null character while 1 m128 result m128 mm cmpeq ss pSrc1 m0 if character is
  • 子菜单未完全并排定位

    我发现了一个问题 sub menu code left and transform translateX 所以我将位置更改为相对位置并使用上面的两个代码重新定位 它似乎有效 但现在我拥有的两个子菜单不再并排 他们所做的只是相距几厘米顶部 不
  • 为什么我的 NSMutableDictionary 为零?

    我正在尝试将数组存储在 NSMutableDictionary 中 但是 在我为其设置对象后 NSMutableDictionary 为空 这是我的代码 感谢任何帮助 NSMutableArray arrTemp NSMutableArra
  • 验证电子邮件地址

    我正在尝试使用以下代码使用 C 发送电子邮件 MailMessage mail new MailMessage mail From new MailAddress fromAddress friendlyName mail To Add t
  • 抽象类的shared_ptr向量到副本向量

    我有一个带有共享指针的向量 std vector