C++ 在我的图形访问者完成后访问属性
我在使用boost图形库中的广度优先搜索时遇到问题。 我想在完成图形的访问后,获得visitor类的一个属性C++ 在我的图形访问者完成后访问属性,c++,boost,destructor,boost-graph,C++,Boost,Destructor,Boost Graph,我在使用boost图形库中的广度优先搜索时遇到问题。 我想在完成图形的访问后,获得visitor类的一个属性 // init my visitor BfsVisitor bv; // auto like in C++-0x BOOST_AUTO (visit, boost::visitor(bv)); // launch search boost::breadth_first_search (graph, vertex, visit); // get result ("typedef pair&
// init my visitor
BfsVisitor bv;
// auto like in C++-0x
BOOST_AUTO (visit, boost::visitor(bv));
// launch search
boost::breadth_first_search (graph, vertex, visit);
// get result ("typedef pair<string, int*> result")
result res = bv.getResult();
// print res: SegFault, `res.second' is NULL
std::cout << *(res.second) << std::endl;
我只想在检查顶点方法的所有过程结束时访问我的属性。我查看了boost graph访问者文档,但没有找到任何解决问题的方法。
希望您能提出建议。请提供一个简短的自包含编译示例。伪代码是有用的或有限的。上面的代码没有
参数
,没有\u res
,并且有一个坏拷贝构造函数,显然不是您的问题的最小示例。制作一个完整的简短示例来演示您的问题。@Yakk我修复了我的代码以添加属性和一些进程,但我的进程可以按我的意愿工作。我可以毫无问题地打印单个结果。我不能给你上行政课,所以你必须相信问题不在里面。对于复制构造函数,我只使用它来打印调用。我自己通常不定义它。From:“由于visitor参数是通过值传递的,因此如果您的visitor包含状态,那么在算法期间对状态的任何更改都将被复制到visitor对象,而不是传入的visitor对象。因此,您可能希望visitor通过指针或引用保持此状态。”。谢谢,我没有看到那张纸条。。。似乎现在起作用了。回答“是”——\u res
的来源相当重要@llonesmiz你应该把答案贴出来,这样Turgal就可以接受了
class BfsVisitor : public boost::default_bfs_visitor
{
public:
BfsVisitor()
{
std::cout << boost::this_thread::get_id()
<<" ~~ CONSTRUCTOR" << std::endl;
}
BfsVisitor(const BfsVisitor& b)
: boost::bfs_visitor<>(),
_res (b._res),
_arg (b._arg)
{
std::cout << boost::this_thread::get_id()
<<" ~~ COPY" << std::endl;
}
~BfsVisitor()
{
std::cout << boost::this_thread::get_id()
<<" ~~ DESTRUCTOR" << std::endl;
}
/// Visitor methods
void discover_vertex(const vertex_t& s,
const Graph& g)
{
std::cout << boost::this_thread::get_id()
<< " -> Discover vertex: " << g[s]._id << std::endl;
Executive exec* = g[s]._executive;
_arg.insert(_res);
exec->setArguments(_arg);
// other process
}
void examine_vertex(const vertex_t& s,
const Graph& g)
{
std::cout << boost::this_thread::get_id()
<< " -> Examine vertex: " << g[s]._id << std::endl;
Executive exec* = g[s]._executive;
exec->launch(&_res);
// other process
}
/// Getter
result getResult() const
{
std::cout << boost::this_thread::get_id()
<< " ~~ Get Result" << std::endl;
return _res;
}
private:
result _res;
argument _arg; // typedef std::map
}
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 ~~ COPY
b7495b40 -> Discover vertex: 1
b7495b40 -> Examine vertex: 1
b7495b40 -> Discover vertex: 2
b7495b40 -> Examine vertex: 2
b7495b40 -> Discover vertex: 3
b7495b40 -> Examine vertex: 3
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ DESTRUCTOR
b7495b40 ~~ Get Result
Segmentation fault (core dumped)