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

时间:2011-06-29 20:16:04

标签: c++ python pointers boost

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

1 个答案:

答案 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类类型,类似于你定义函数的方式,但是我自己从未尝试过。

我希望这会对你有所帮助。