0

因此,在处理完最后一个问题之后,我将其归结为:

我需要将未知数量的用户定义类 ( 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

}

我试过的:

  1. 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&)
    
  2. 制作指针:这不起作用,函数无法正常工作,并且不会被破坏

    new object_c(ctor_data);
    
  3. 将对象推回std::vector这不起作用,当我尝试时会增加数十行的咆哮(在此处输出)

    vector_of_objects.push_back(object_c(ctor_data));
    
  4. 只是宣布该死的事情:显然不起作用,立即超出范围(dur)

    object_c(ctor_data);
    

我确信有一种简单的方法可以做到这一点。有人有想法么?我周末大部分时间都在处理这个问题。

4

3 回答 3

2

#3应该是您需要使用的方法。您需要详细说明您的错误是什么。

如果它就像operator=您在上一个问题中显示的那样,并且您不想定义一个,那么emplace_back只要您在C++11. 当然我在说std::vector,我需要检查什么是等效的,如果有的话boost::intrusive。编辑:我可能错了,但它似乎还不支持移动语义..

或者#2与智能指针一起使用。

如果您要使用#1,则需要placement new按照@rasmus 的指示使用。

于 2013-01-28T01:26:14.313 回答
1

在文档使用部分的末尾,它告诉您

“存储对象的生命周期不受容器绑定或管理”

所以你需要以某种方式管理对象的生命周期。

一种方法是将它们放在 中std::vector,如文档的最后一个示例中所示。

于 2013-01-28T01:41:47.910 回答
0

抱歉回复晚了,考试学习等等。

基本上,它比我想象的要简单。另外,对于这个答案,我将我的类称为entity_c,因此对象entity_c实际上是有意义的。

我在我的 OP 中所做的是,当我push_back'时entity_c,它会自动将自身添加到global intrusive::list中,并且不知何故使它不起作用。在我不再懒惰之后,我编写了一个最小的可编译程序并玩弄了它。我发现制作一个std::vector来存储构造entity_c的 s 是有效的(即使在添加它们时它会解构它们?我不知道那是什么)。然后我所要做的就是用这些对象填充一个本地,然后将 本地列表intrusive::list克隆到全局列表中。

感谢所有的帮助,我会调整该程序以尝试适应不同的东西,就像placement new@rasmus 建议的那样(谢谢你,以前没见过)。还要感谢@karathik 展示了我的emplace_new,我想我可能需要去了解所有这些已添加的新 C++11 功能,有很多很酷的功能。我什至学会了如何制作自己的复制构造函数。
真实而有启发性的教育经验。

于 2013-01-29T03:17:30.923 回答