加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:24:11 所属栏目:Python 来源:网络整理
导读:我正在使用Boost. Python将我的C代码暴露给Python.我遇到了一个与一个对象多次从一种语言传递到另一种语言有关的困难.这就是我想要做的事情: C代码 class Base{ public: void baseTest() { std::cout "Base::basetest()"; }};class Deriv : public Base{ pu
我正在使用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.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读