c++ - 使用 Python 检索 C++ 对象成员指针

标签 c++ python pointers boost

我在我的应用程序中使用 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/

相关文章:

python - 如何将列表中具有公共(public)组件的向量放在一起?

c - C 中的内存分配和指针

c++ - 删除多个列表指向的数据?

python - 如何在 Python 中使用 beanstalkc 对 URL 进行排队并执行作业

带有托管对象的 C++ vector

c++ - QImage::load 导致应用程序崩溃

c++ - G++ 4.8 中的 GLM 和原子

python - 如何在图像上绘制矢量场?

c++ - 非类类型成员getName请求错误 'char'

c++ - getline 语句未获取输入