我有两个自定义C ++类if (out[0] > price) {
console.log('more');
document.getElementById('btc').innerHTML = out[0];
document.getElementById('btc').style.color = "green";
}
else {
console.log('less');
price = out[0];
document.getElementById('btc').innerHTML = out[0];
document.getElementById('btc').style.color = "red";
}
和Foo
,我已经通过Boost Python成功地向Python公开了这些类;用户与在其下运行C ++对应项的Python类进行交互。一个重要的用例是将Baz
Python实例传递给Python方法Foo
。 Python绑定方法是,
Baz.run_that_foo
重要的是,// Note `XPython` is the name for the Boost Python bindings class of `X`.
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
auto ps_ptr = foo_obj.GetPSPtr();
Baz::DoPSComputation(ps_ptr); // Expects a `const std::shared_ptr<planning_scene::PlanningScene>`
}
应该是指向PlanningScene实例的共享指针(即ps_ptr
),其中该类被声明为,
std::shared_ptr<planning_scene::PlanningScene>
在我的C ++ class PlanningScene : private boost::noncopyable, public std::enable_shared_from_this<PlanningScene>
课程中,
Foo
其中std::shared_ptr<planning_scene::PlanningScene> Foo::GetPSPtr() { // two different attempts shown
// return ps_;
return (*ps_).shared_from_this();
}
是指向ps_
构造函数中std::make_shared
创建的PlanningScene实例的有效共享指针。
运行一些C ++集成测试工作正常,我将Foo
直接在C ++中从foo_ptr
传递给Foo
。但是Baz
上的python集成测试(使用绑定类)失败了。这可能有什么问题?我在Boost Python段错误,Segmentation fault (core dumped)
等方面挖掘了许多SO问题,但无济于事。提前谢谢!
答案 0 :(得分:1)
诀窍是使用boost::bind
围绕我们从Python绑定类(即FooPython.GetPSPtr
)调用的方法生成转发调用包装器:
void BazPython::RunThatFoo(const bp::object & foo) {
FooPython & foo_obj = bp::extract<FooPython&>(foo);
Baz::DoPSComputation(boost::bind(&Foo::GetPSPtr, &foo_obj)());
}