gpt4 book ai didi

c++ - Python 到 C++ : From Deriv, 到 Base,再到 Deriv

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:43 26 4
gpt4 key购买 nike

我正在使用 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)

我想要发生的事情

  1. C++:调用 Python 中定义的 run() 函数。 (这里没问题)

  2. Python:run() 创建一个新的 Deriv 对象;它通过 call 函数将它和一个函数对象 callback 传递回 C++。 (也行)

  3. C++:call()Deriv 对象作为Base&。它将 Base-reference 传递给它通过第二个参数接收到的 Python 回调。

  4. 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(“内存” header ),但它导致了崩溃。我必须使用 boost::shared_ptr 才能工作。 (我使用的是 Boost 1.46.1 版。)

关于c++ - Python 到 C++ : From Deriv, 到 Base,再到 Deriv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6872701/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com