c ++ boost clone ptr vector

时间:2013-09-20 08:26:01

标签: c++ boost vector pointers

我在复制ptr_vector方面遇到了困难。

我正在使用一个具有Act对象向量的解决方案类。 在每个Act类中,我有一个ptr_vector,它链接回其他Act对象。 我从txt文件中读取了一些数据并将其存储在Sol对象中。现在我如何将此Sol对象复制到其他Sol对象(例如在向量中)。我尝试使用release和clone在sol类中编写自己的拷贝构造函数,但似乎ptr_vector不能轻易复制。

提前致谢。

class Sol
{
 public:
//data
int obj;
vector<Act*> deficit_act;
int deadline;
int nbr_res;
int nbr_act;
std::vector<Act> act;
std::vector<Res> res;
}

#include <boost/ptr_container/ptr_vector.hpp>
#include <boost/ptr_container/clone_allocator.hpp>
class Act
{
public:
//static
int id;
int es;//earliest start
int ls;//latest start
int range;//difference between ls and es
int dur;//duration of the activity
std::vector<int> dem;//demand requirement for every resource: needs to be      initiliased
//predecessors and successors
int nrpr;
int nrsu;
boost::ptr_vector<Act> pr;
boost::ptr_vector<Act> su;
//dynamic
int start;
int end;
Act():id(-1),es(0),ls(0),range(0),dur(0),nrpr(0),nrsu(0),start(-1),end(-1){}
~Act(){}
    };

   //inside the main.cpp
    Sol emptysol;
read_instance(emptysol,instance_nr,"J301_1");
emptysol.calc_parameters();
vector<Sol> sol;
sol.reserve(pop_size);
for(int ind=0;ind<pop_size;++ind)
{
    sol.push_back(Sol(emptysol));// this throws a stack overflow error
}

1 个答案:

答案 0 :(得分:0)

您收到堆栈溢出错误的事实表明复制构造函数或push_back启动无限递归。在您的情况下,这可能发生的方式是pr对象的suAct指针向量是否包含循环。如果您尝试使用非空Sol向量复制构造Act对象,其中这些向量中的Act对象包含循环,则意味着您会收到此错误。

为了明确这一点:ptr_vectors的复制构造函数将对指向的对象进行复制(在ptr_vector语言中使用'Clone')。如果su成员将指向拥有它的Act对象(直接或间接),则会启动无限递归。

This所以问题就是ptr_vector复制构造函数的细节。