我使用Boost Python来包装C++程序并用Python创建一个对话框。然后单击一个按钮,回调Python函数,返回这个对象指针到这个函数,但是对象成员数据似乎全部清除了
class MyObj
{
public:
OtherThing();
ConnectFunc(boost::python::object callbackfun){m_pyCallbackFunc=callbackfun;}
//some operation will call below function
DoSomething(){m_pyCallbackFunc(this)}
private:
boost::python::object m_pyCallbackfunc;
vector<int> m_vecData;
}
def callback(myobject):
#call my object functions again
myobject.Otherthing()
//first generate C++ object by python ,such as
obj=MyObj
obj.ConnectFunc(callback)....
一切正常,但当执行OtherThing()函数时,成员数据 mu vecData已清除。我在调用python函数“callback”时发现, MyObj将调用销毁函数,因此数据已被清除
有谁能帮我避免它,我想保留它?或者任何人给我好主意
执行以下操作时:
您的
m_pyCallbackFunc
从它的副本接收一个新的代理对象,这意味着它接收的对象不是DoSomething
接收的对象。假设您有以下类:导出如下:
可以肯定地假设
foo.bar()
将返回foo
,但事实并非如此。以下操作将引发断言错误:因为返回的是一个新的代理对象。如果要将同一对象传递回Python,则必须声明您的类(如Boost know ithas back references)或my favorite;将方法声明为static并提取实例:
现在,上面的代码将不再引发断言错误,因为返回的对象与接收到的对象相同。基本上,调用析构函数是因为代理对象生成的副本超出范围并被释放。你知道吗
相关问题 更多 >
编程相关推荐