首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python C++:从基板到基座,再到基座

Python C++:从基板到基座,再到基座
EN

Stack Overflow用户
提问于 2011-07-29 11:53:18
回答 1查看 157关注 0票数 4

我使用Boost.Python向Python公开我的C++代码。我遇到了一个与将对象从一种语言多次传递到另一种语言有关的困难。我想做的是:

C++码

代码语言:javascript
复制
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代码

代码语言:javascript
复制
from event import *

def callback(deriv):
    deriv.baseTest() # works fine
    deriv.derivTest() # crash!

def run():
    d = Deriv()
    call(d, callback)

我想要发生的

  1. C++:调用在run()中定义的run()函数。(这里没有问题)
  2. Python:run()创建了一个新的Deriv对象;它通过call函数将它和一个函数对象callback传递回C++。(也可以)
  3. C++:call()Deriv对象作为Base&。它将基引用传递给它通过第二个parameter.
  4. Python:接收到的Python回调,回调从C++接收Base对象。然而,它希望它是一个Deriv:如果我将derivTest()称为程序崩溃。但是,如果我调用baseTest(),它就不会崩溃。

怎么才能让回调不崩溃呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-29 17:44:44

谢谢你的评论,我找到了解决这个问题的办法。实际上非常简单,您只需将Base包装在一个shared_ptr中,而不是通过引用传递它,如下所示:

代码语言:javascript
复制
void call(boost::shared_ptr<Base> b, boost::python::object func)
{
    func(b);
}

但一定要小心点。我尝试使用VisualVISUAL2010Express(“内存”头)附带的std::shared_ptr,它导致了崩溃。我必须使用boost::shared_ptr才能让它工作。(我使用的是Boost的1.46.1版。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6872701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档