boost python 函数中传递对象

本文深入探讨了C++中封装类与Python之间的绑定技术,通过具体实例展示了如何实现C++类到Python的无缝转换,以及如何在Python环境中调用C++类的方法。重点介绍了封装类的构造函数、析构函数、属性访问和方法调用的Python绑定实现,同时阐述了在实际应用中可能遇到的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

class 类

class XEventWarp:public XEvent
{
public:
	PyObject *self;
	XEventWarp(PyObject* self_):self(self_){ Py_INCREF(self); }
	XEventWarp( PyObject* self_, const XEvent& copy ) : XEvent(copy), self(self_) { Py_INCREF(self); }
	 ~XEventWarp() {Py_DECREF(self); }
	 
};

BOOST_PYTHON_MODULE(_core)
{
	class_<XEvent, auto_ptr<XEventWarp> >("XEvent")
		.def("Skip",&XEvent::Skip)
		.def("Stop",&XEvent::Stop)
		.def("__cmp__",&XEvent::Cmp)
		.add_property("wKeyState",&XEvent::GetWKeyState)
		.add_property("cpt",&XEvent::GetClientPos)
		.add_property("spt",&XEvent::GetScreenPos)
		.add_property("hWnd",&XEvent::GetHandler)
		.add_property("tick",&XEvent::GetTime)
		.add_property("lParam",&XEvent::GetLParam)
		.add_property("wParam",&XEvent::GetWParam)
	;
	implicitly_convertible<auto_ptr<XEventWarp>, auto_ptr<XEvent>>();
}

XEvent导出函数模板,其中OnEvent函数定义为VOID OnEvent(XEvent* evt)

由于是虚函数 所以需要写一个包装类

class HWndObjectWapper:public HWndObject,public wrapper<HWndObject>
{

public:
	HWndObjectWapper(){}
	HWndObjectWapper(std::string className,std::string sbClassName)
		:HWndObject(className,sbClassName){}

	VOID OnEvent(XEvent* evt)
	{
		if(override function=this->get_override("OnEvent"))
		{
			//object obj(evt); 
			//function(obj); 
			reference_existing_object::apply<XEvent*>::type converter;
			PyObject* obj = converter(evt);
			object real_obj = object( handle<>( obj ) );
			function(real_obj);
		}
		else
		{
			this->HWndObject::OnEvent(evt);
		}
	};

	VOID OnFinalMessage()
	{
		if(override function=this->get_override("OnFinalMessage"))
		{
			function();
		}
		else
		{
			this->HWndObject::OnFinalMessage();
		}
	}

	VOID DefaultOnFinalMessage(){ HWndObject::OnFinalMessage();};
	VOID DefaultOnEvent(XEvent* evt){ HWndObject::OnEvent(evt);};


};
其中有两种调用方式,如果需要 传递到py里面的object和C++ object绑定

则 

reference_existing_object::apply<XEvent*>::type converter;
PyObject* obj = converter(evt);
object real_obj = object( handle<>( obj ) );
function(real_obj);

如果 不需要 关联 则

object obj(evt);
function(obj);

直接调用即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值