我对unique_ptr的std::列表有一个奇怪的问题。
slFlyingMonster类是从slMonster类派生的。
以下代码有效:
std::unique_ptr<slMonster> ptr(new slFlyingMonster(md));
但是这个代码:
std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(new slFlyingMonster(md));
抛出错误:
"错误1错误C2664:'void
std::列表
虽然我知道,有些地方是错误的,比如 std::list.push_back() 与 = 不同,但我无法弄清楚如何正确添加新类作为unique_ptr列表。任何建议将非常受欢迎。
使用mMonsters.emplace_back
以便从参数中给出的参数创建对象。
您可以使用emplace_back
:
std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.emplace_back(new slFlyingMonster(md));
或push_back标准::make_unique
:
std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.push_back(std::make_unique<slFlyingMonster>(md));
或std::移动
的std::unique_ptr
std::list<std::unique_ptr<slMonster>> mMonsters;
std::unique_ptr<slMonster> p(new slFlyingMonster(md));
mMonsters.push_back(std::move(p));
构造函数 std::unique_ptr
当您具有列表包含的对象类型并且想要推送其副本时,请使用 push_back
。通常,如果你还没有这样的对象(在你的例子中,你没有),你最好直接在列表中初始化一个新对象——改用emplace_back
:
std::list<std::unique_ptr<slMonster>> mMonsters;
mMonsters.emplace_back(new slFlyingMonster(md));
然而,正如@SebastianRedl在评论中正确指出的那样,上述内容存在异常安全的问题。如果std::list
中新节点的内部分配抛出,则新的slFlyingMonster
实例将被泄漏<当其中一个参数是未受保护的资源(例如拥有内存的原始指针)时,code>templateback不是正确的选择。
因此,您实际上需要构造一个包装器智能指针并将其推入列表。在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)));
问题内容: 我要返回一个Mongoose文档,并希望在发送之前向其中添加一些元数据。但是,我无法添加任何属性,我不确定为什么。我检查了它是否可以使用Object.isExtensible(doc)扩展。 可能是什么问题? 问题答案: 啊..我的对象是一个Mongoose文档,不允许添加属性。解决方案是将返回的文档转换为普通对象,或者在查询中调用lean()。
问题内容: 如何将对象添加到数组(使用javascript或jquery)?例如,此代码有什么问题? 我想使用此代码在function1数组中保存许多对象,并调用function2在数组中使用该对象。 如何将对象保存在数组中? 如何将对象放入数组并将其保存到变量? 问题答案: 使用Array.push()将任何东西放入数组。 有关数组的更多信息 一次添加多个项目 将项目添加到数组的开头 将一个数组
我想编写一个名为addNewPhone(Phone newPhone)的方法,将一个Phone添加到一个电话数组列表中; 电话类别: 车间类别: 主要类: 我知道我需要返回ArrayList,并且我需要在这个方法中接收Phone type对象,然后它应该返回ArrayList和一个新的phones,但我不知道为什么它不起作用。 Eclipse显示我符合的方法:“newPhone无法解析或未归档”。
问题内容: 这是我的对象文字: 我如何添加字段与对象? 问题答案: 有两种向对象添加新 属性的 方法: 使用点表示法: 使用方括号表示法: 当您知道属性名称时,将使用第一种形式。动态确定属性名称时,使用第二种形式。像这个例子: 甲 真实 JavaScript数组可使用任一构造: 数组文字符号: 数组构造器符号:
问题内容: 我想向中添加一个对象,但是每次我向具有3个属性的新对象添加时,都会出现错误。 在这里,我正在尝试创建其对象并将其传递给的类。 问题答案: 创建对象时需要使用运算符 要不然 并且您的构造函数不应包含。否则它将成为您班上的一个方法。
问题内容: 所以我在Python3.5上使用psycopg2将一些数据插入到postgresql数据库中。我想做的是有两列是字符串,最后一列只是一个dict对象。我不需要搜索字典,只需能够将其从数据库中拉出并使用它即可。 因此例如: 这有可能吗,如果可以的话,我将如何去做呢? 问题答案: 如果您的PostgreSQL版本足够新(9.4+)并且psycopg版本> = 2.5.4,则所有键都是字符串
问题内容: 我有一个特定的类C的arraylist。 C类具有两个属性,即。 现在,当我将C类型的对象添加到ArrayList myList时,我想检查列表中是否已经存在对象,且其str1和str2的值与该对象的参数值(str1和str2)相匹配我要补充。 有什么有效的方法可以执行此操作,而不必每次都遍历完整列表并检查参数之间是否匹配? 问题答案: 您需要重写C类中的方法。 例如 然后,可以调用m
问题内容: 我想将图像文件添加到json对象中。是否可以将图像文件添加到json对象中? 我尝试了下面的代码,但它不起作用?因为我想将json对象发送到服务器,所以服务器将读取我的图像文件并将其存储到该数据库中。 因此,当我打印此json对象时,它仅显示图像存储的图像路径。我想要文件以将其发送到服务器。 问题答案: 您将需要阅读从入,并把该对象到您。 您还应该看看以下帖子: JSON中的ByteA