我在我的应用程序中使用box2d。它有一个班级b2Body
。它有一个属性void *userData
以及它访问的方法。换句话说:我们可以存储一些关于物理身体的其他信息。我想在那里存储一些类对象:
MyClass *obj = new MyClass();
b2Body body;
body.SetUserData(obj);
现在我必须在python中获取用户数据!我写了一个函数包装器,它返回提取的指针:
MyClass *GetBodyUserData(b2Body &body)
{
void *userData = body.GetUserData();
if (userData) return (MyClass*)userData;
std::cout << "Fail.";
return nullptr;
}
现在,当我在python中调用GetBodyUserData
时,我有一个空的或“死”的对象:(。
我试图存储纯粹的智能指针,但SetUserData
接口不允许这样做。
有什么想法吗?
UPD 导出到python:
bp::def("GetBodyUserData", &GetBodyUserData, boost::python::return_value_policy <boost::python::reference_existing_object>())
答案 0 :(得分:1)
你只需要做C风格,即将指针传递给函数,返回你想要的特定项目。 C ++对象与python对象不同。
Python甚至没有你的c ++对象的定义,所以即使它们在内存中看起来相同,python也可以使用它,因为它不知道它的内部值和函数是什么。
记住指针只是一个代表对象内存地址的数字。
所以说你的myclass有一个你希望能够从python编辑的成员值。
您需要定义一个集合并获取函数
set函数应采用python值,然后将((MyClass *)obj) - &gt;值设置为此值,而get函数将返回((MyClass *)obj) - &gt; value
你也可以在python中构造一个具有适当设计的MyClass,并简单地调用C风格的函数。
P.S。
我相信也可以用C ++定义一个python类类型,类似于你定义函数的方式,但是我自己从未尝试过。
我希望这会对你有所帮助。