【问题标题】:retrieve C++object member pointer using Python使用 Python 检索 C++ 对象成员指针
【发布时间】:2011-06-29 20:16:03
【问题描述】:

我在我的应用程序中使用 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 接口不允许。

有什么想法吗?


更新 导出到python:

bp::def("GetBodyUserData", &GetBodyUserData, boost::python::return_value_policy <boost::python::reference_existing_object>())

【问题讨论】:

  • 你所做的非常好,C++ 明智的。你如何将指针传递给 Python?

标签: c++ python pointers boost


【解决方案1】:

您只需按照 C 风格进行操作,即将指针传递给函数并返回您想要的特定项目。 C++ 对象与 python 对象不同。

另外,Python 甚至没有你的 c++ 对象的定义,所以即使它们在内存中看起来相同,python 也可以使用它,因为它不知道它的内部值和函数是什么。

记住指针只是一个代表对象内存地址的数字。

假设你的 myclass 有一个你希望能够从 python 编辑的成员值。

你需要定义一个set和get函数

set 函数应该取一个 python 值,然后将 ((MyClass *)obj)->value 设置为这个值,而 get 函数将返回 ((MyClass *)obj)->value

您还可以在 python 中构造一个具有适当设计的 MyClass,并简单地调用 C 风格的函数。

附言

我相信也可以从 C++ 定义一个 python 类类型,类似于定义函数的方式,但是我自己从未尝试过。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-24
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 2013-05-02
    • 2012-07-07
    相关资源
    最近更新 更多