
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)
我想要发生什么
> C:调用Python中定义的run()函数. (没问题)
> Python:run()创建一个新的Deriv对象;它通过调用函数传递它和一个函数对象,回调,回到C. (也没关系)
> C:call()将Deriv对象作为Base& ;.它将Base-reference传递给它通过第二个参数接收的Python回调.
> Python:回调从C接收Base对象.但是,它期望它是Deriv:如果我调用derivtest()程序崩溃.但是,如果我调用basetest(),它不会崩溃.
如何使回调不崩溃?
解决方法 感谢您的评论,我找到了解决方案.它实际上非常简单,您只需将Base对象包装在shared_ptr中,而不是通过引用传递它,如下所示:voID call(boost::shared_ptr<Base> b,boost::python::object func){ func(b);} 但要小心一些事情.我试图使用Visual C 2010 Express附带的std :: shared_ptr(‘内存’标题),它导致崩溃.我必须使用boost :: shared_ptr才能工作. (我正在使用Boost版本1.46.1.)
总结以上是内存溢出为你收集整理的Python到C:从Deriv,到Base,再到Deriv全部内容,希望文章能够帮你解决Python到C:从Deriv,到Base,再到Deriv所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)