0

我在复制 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
}
4

1 回答 1

0

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

只是为了说明这一点:ptr_vectors 的复制构造函数将复制(ptr_vector 语言中的“克隆”)指向的对象。如果su成员将指向拥有它(直接或间接)的 Act 对象,您将启动无限递归。

这个SO question 详细介绍了 ptr_vector 复制构造函数。

于 2013-09-20T08:47:51.807 回答