Python到C:从Deriv,到Base,再到Deriv

Python到C:从Deriv,到Base,再到Deriv,第1张

概述我正在使用Boost. Python将我的C代码暴露给Python.我遇到了一个与一个对象多次从一种语言传递到另一种语言有关的困难.这就是我想要做的事情: C代码 class Base{ public: void baseTest() { std::cout << "Base::basetest()"; }};class Deriv : publ 我正在使用Boost. Python将我的C代码暴露给Python.我遇到了一个与一个对象多次从一种语言传递到另一种语言有关的困难.这就是我想要做的事情:

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&amp ;.它将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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1196530.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-03
下一篇2022-06-03

发表评论

登录后才能评论

评论列表(0条)

    保存