ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 无法理解如何将新对象添加到std :: list>

2019-07-25 05:07:56  阅读:190  来源: 互联网

标签:c c11 stl unique-ptr


我对于unique_ptr的std :: list有一个奇怪的问题.

类slFlyingMonster派生自类slMonster.

以下代码有效:

std::unique_ptr<slMonster> ptr(new slFlyingMonster(md));

但是这段代码:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(new slFlyingMonster(md));

抛出错误:

“Error 1 error C2664: ‘void
std::list>,std::allocator>>>::push_back(const
std::unique_ptr<_Ty,std::default_delete<_Ty>> &)’ : cannot convert
argument 1 from ‘slFlyingMonster *’ to
‘std::unique_ptr> &&'”

虽然我明白,有些东西是错的,比如std :: list.push_back()和=不一样,但是我无法弄清楚如何正确地将新类添加为unique_ptr to list.任何建议都会非常受欢迎.

解决方法:

如果您拥有列表所包含类型的对象,并且想要推送其副本,请使用push_back.通常情况下,如果你还没有这样的对象(在你的情况下,你没有),你最好直接在列表中初始化一个新对象 – 使用emplace_back代替:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.emplace_back(new slFlyingMonster(md));

但是,正如@SebastianRedl在评论中正确指出的那样,上面的问题不是例外安全.如果std :: list中的新节点的内部分配抛出,则新的slFlyingMonster实例将被泄露.当其中一个参数是不受保护的资源(例如拥有内存的原始指针)时,emplace_back不是正确的选择.

所以你实际上想构建一个包装器智能指针并将其推入列表中.在C 14中,您可以使用std :: make_unique执行此操作:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(std::make_unique<slFlyingMonster>(md));

使用普通的C 11,您可以实现自己的make_unique,也可以显式创建智能指针:

std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.emplace_back(std::unique_ptr<slMonster>(new slFlyingMonster(md)));

标签:c,c11,stl,unique-ptr
来源: https://codeday.me/bug/20190725/1529656.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有