我在我的应用程序中使用 box2d。它有一个类 b2Body
。它有一个属性 void *userData
和它访问的方法。换句话说:我们可以在那里存储一些关于物理 body 的额外信息。我想在那里存储一些类对象:
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
接口(interface)不允许这样做。
有什么想法吗?
更新 导出到 python:
bp::def("GetBodyUserData", &GetBodyUserData, boost::python::return_value_policy <boost::python::reference_existing_object>())
最佳答案
你只需要用 C 风格来做,即将指针传递给一个函数,返回你想要的特定项目。 C++ 对象与 Python 对象不同。
而且 Python 甚至没有你的 c++ 对象的定义,所以即使它们在内存中看起来相同,python 也可以使用它,因为它不知道它的内部值和函数是什么。
请记住,指针只是一个代表对象内存地址的数字。
假设您的 myclass 有一个您希望能够从 python 编辑的成员值。
你需要定义一个set和get函数
set 函数应该接受一个 python 值,然后将 ((MyClass *)obj)->value 设置为此值,而 get 函数将返回 ((MyClass *)obj)->value
您还可以在具有适当设计的 Python 中构造一个 MyClass,并简单地调用 C 风格的函数。
附言
我相信也可以从 C++ 定义 python 类类型,类似于您定义函数的方式,但我自己从未尝试过。
希望对你有帮助
关于c++ - 使用 Python 检索 C++ 对象成员指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6526697/