我使用Boost.Python向Python公开我的C++代码。我遇到了一个与将对象从一种语言多次传递到另一种语言有关的困难。我想做的是:
C++码
class Base
{
public:
void baseTest() {
std::cout << "Base::basetest()";
}
};
class Deriv
: public Base
{
public:
void derivTest() {
std::cout << "Deriv::derivTest()";
}
};
void call(Base& b, boost::python::object func)
{
func(b);
}
BOOST_PYTHON_MODULE(event)
{
using namespace boost;
using namespace boost::python;
class_<Base>("Base")
.def("baseTest", &Base::baseTest)
;
class_<Deriv, bases<Base>>("Deriv")
.def("derivTest", &Deriv::derivTest)
;
def("call", call);
}Python代码
from event import *
def callback(deriv):
deriv.baseTest() # works fine
deriv.derivTest() # crash!
def run():
d = Deriv()
call(d, callback)我想要发生的
run()中定义的run()函数。(这里没有问题)run()创建了一个新的Deriv对象;它通过call函数将它和一个函数对象callback传递回C++。(也可以)call()将Deriv对象作为Base&。它将基引用传递给它通过第二个parameter.Base对象。然而,它希望它是一个Deriv:如果我将derivTest()称为程序崩溃。但是,如果我调用baseTest(),它就不会崩溃。怎么才能让回调不崩溃呢?
发布于 2011-07-29 17:44:44
谢谢你的评论,我找到了解决这个问题的办法。实际上非常简单,您只需将Base包装在一个shared_ptr中,而不是通过引用传递它,如下所示:
void call(boost::shared_ptr<Base> b, boost::python::object func)
{
func(b);
}但一定要小心点。我尝试使用VisualVISUAL2010Express(“内存”头)附带的std::shared_ptr,它导致了崩溃。我必须使用boost::shared_ptr才能让它工作。(我使用的是Boost的1.46.1版。)
https://stackoverflow.com/questions/6872701
复制相似问题