Python到C:从Deriv,到Base,再到Deriv
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python到C:从Deriv,到Base,再到Deriv,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1469字,纯文字阅读大概需要3分钟。
内容图文
![Python到C:从Deriv,到Base,再到Deriv](/upload/InfoBanner/zyjiaocheng/769/a0e2d93a297646f3861cb98f2a0f6141.jpg)
我正在使用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& ;.它将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所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。