因此,在my last question工作之后,我将其归结为:
我需要将未知数量的用户定义类(object_c
)添加到boost::intrusive::list
。这些类中包含const
个成员。我需要做的就是将它们推送到list
是构建它们然后让它们持续存在,它们会自动添加它们。
有问题的代码基本上是
for (unsigned i = 0; i < json_objects.count(); ++i) {
ctor_data = read(json_objects[i]);
// construct object here
}
malloc
一系列对象,然后将其填入:不起作用,因为我有const
个成员。
static object_c *json_input = (object_c*) malloc(json_objects.size() * sizeof(object_c));
...
json_input[i](ctor_data); //error: no match for call to (object_c) (ctor_data&)
制作指针:这不起作用,功能无法正常使用,并且不会被破坏
new object_c(ctor_data);
将对象推回std::vector
:这不起作用,当我尝试(output here)
vector_of_objects.push_back(object_c(ctor_data));
刚刚宣布这件事:显然不起作用,立即超出范围(dur)
object_c(ctor_data);
我确信有一种简单的方法可以做到这一点。有人有主意吗?我在周末的大部分时间都遇到过这个问题。
答案 0 :(得分:2)
#3
应该是您需要使用的方法。你需要详细说明你的错误。
如果您在上一个问题中显示的只是operator=
,并且您不想定义一个,只要您在emplace_back
,就可以尝试C++11
。当然我在说std::vector
,我需要检查boost::intrusive
中的等价物是什么。编辑:我可能错了,但它似乎还不支持移动语义..
或者使用智能指针#2
。
如果您选择#1
,则需要使用placement new
,因为@rasmus表示。
答案 1 :(得分:1)
在the documentation's usage section结束时,它会告诉您
“存储对象的生命周期不受容器绑定或管理”
所以你需要以某种方式管理对象的生命周期。
一种方法是将它们放在std::vector
中,如文档的最终示例所示。
答案 2 :(得分:0)
很抱歉迟到的回复,考试和所有这些。
基本上,这比我做出来的要简单得多。另外,对于这个答案,我将我的班级称为entity_c
,以便entity_c
的对象真正有意义。
我在我的OP中所做的是当push_back
和entity_c
时,它自动将自己添加到全局 intrusive::list
,并以某种方式这使它无法运作。在我不再懒惰之后,我写了minimal compilable progam并玩弄了它。我发现制作一个std::vector
来存储已构建的entity_c
(虽然它们在被添加时解构了它们?我不知道那是什么意思)。然后,我所要做的就是用这些对象填充本地 intrusive::list
,然后将本地列表克隆到全局列表中。
感谢所有的帮助,我会调整该程序以尝试适应不同的东西,例如@rasmus建议的placement new
(感谢你,之前没见过)。还要感谢@karathik展示我的emplace_new
,我想我可能不得不去了解所有这些新增的C ++ 11功能,还有很多很酷的功能。我甚至学会了如何制作自己的复制构造函数
真实而有启发性的教育经历。