如何用const成员构造动态数量的类?

时间:2013-01-28 01:15:02

标签: c++ class constructor const declaration

因此,在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

}

我尝试了什么:

  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这不起作用,当我尝试(output here)

    时,会增加数十行的数量
    vector_of_objects.push_back(object_c(ctor_data));
    
  4. 刚刚宣布这件事:显然不起作用,立即超出范围(dur)

    object_c(ctor_data);
    
  5. 我确信有一种简单的方法可以做到这一点。有人有主意吗?我在周末的大部分时间都遇到过这个问题。

3 个答案:

答案 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_backentity_c时,它自动将自己添加到全局 intrusive::list,并以某种方式这使它无法运作。在我不再懒惰之后,我写了minimal compilable progam并玩弄了它。我发现制作一个std::vector来存储已构建的entity_c(虽然它们在被添加时解构了它们?我不知道那是什么意思)。然后,我所要做的就是用这些对象填充本地 intrusive::list,然后将本地列表克隆到全局列表中。

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