繁体   English   中英

复制基类参考值以使用shared_ptr进行映射

[英]Copy base class reference value to map with shared_ptr

我有一个基类和派生类(BaseObj和Derived Obj),并且我需要有一个字符串键映射,该映射具有指向对象的指针:

std::map<std::string, std::shared_ptr<BaseObj>

这很复杂:映射值必须在堆上,因为对象将超出范围,但是对象通过引用传递给函数:

void insert_in_map(std::string, const& BaseObj);

由于引用是针对基类的,因此(据我所知)没有办法将基础值复制到堆中并获得指向该基址的指针。 我能想到的唯一解决方案是更改函数原型以接受已经在堆上分配了对象的shared_ptr。 但是,我真的想避免在所有调用者中创建shared_ptr,特别是因为必须将shared_ptr复制到地图中。

有任何想法吗?

有任何想法吗?

是的,您应该将函数签名更改为:

void insert_in_map(std::string, std::unique_ptr<BaseObj>);

因此,这将清楚地表明函数拥有对象的所有权。 除非您确实需要共享所有权,否则您的地图可能还应该更改为具有std::unique_ptr而不是共享的。 在这种情况下,您可以将它们都更改为std::shared_ptr (这比在函数内部将std::unique_ptr转换为std::shared_ptr更为有效)。 我将创建类型别名并在两种情况下都使用它。

但是,我真的想避免在所有调用者中创建shared_ptr,特别是因为必须将shared_ptr复制到地图中。

它不必复制,可以移动到地图中,因此您的推理很奇怪-您不应该获取由const引用传递的对象的所有权。

如果无法更改函数签名,则可以将虚拟方法std::shared_ptr<BaseObject> clone()到基类中并进行相应的覆盖。 但这在您的情况下似乎是不合理的,因为您可以更改函数签名,所以出于某些奇怪的原因,您不需要。

暂无
暂无

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

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