получить указатель на член объекта C ++, используя Python - PullRequest
3 голосов
/ 30 июня 2011

Я использую 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;
}

Теперь, когда я вызываю GetBodyUserData в python, у меня появляется пустой или «мертвый» объект: (.

Я пытался сохранить смарт-указатель вместо чистого, но это не разрешено интерфейсом SetUserData.

Есть идеи?


UPD Экспорт в python:

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

1 Ответ

1 голос
/ 04 июля 2011

Вы просто должны сделать это в стиле C, то есть передать указатель на функцию, которая возвращает определенный элемент, который вы хотите.Объекты C ++ - это не то же самое, что объекты Python.

Кроме того, Python даже не имеет определения вашего объекта C ++, поэтому даже если они выглядят одинаково в памяти, Python может использовать его, так как он этого не делает.знать, каковы его внутренние значения и функции.

Помните, что указатели - это просто число, представляющее адрес памяти объекта.

Итак, скажем, у myclass есть значение члена, которое вы хотите иметь возможностьредактировать из python.

Вам нужно определить функцию set и получить

функция set должна принять значение python, а затем установить значение ((MyClass *) obj) -> в это значениев то время как функция get вернет ((MyClass *) obj) -> значение

Вы также можете создать MyClass в python, который имеет соответствующий дизайн, и просто вызывает функции в стиле C.

PS

Я полагаю, что также возможно определить тип класса Python из C ++, аналогично тому, как вы определяете функции, однако я никогда не пробовал это сам.

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...