Умные указатели с PythonQt - PullRequest
0 голосов
/ 29 ноября 2011

Мое приложение использует QSharedPointers в API C ++, где вместо возврата объекта он обычно возвращает умный указатель на него, и каждый класс для удобства имеет сопровождающий typedef.

class SomeClass
{
 SomeClassP getInstance() { return SomeClassP(new SomeClass()); }
}
typedef QSharedPointer<SomeClass> SomeClassP;

Это сработало, но мне интересно, как / если мой дизайн должен быть изменен для обработки интеграции PythonQt.Например, в PythonQtWrapper, что я должен возвращать из указателей?Если я имею дело с указателями в python, как я могу вызвать другие функции, которые используют умный указатель, а не обычный указатель?Нужно ли выставлять умный указатель на PythonQt?Похоже, что в boost :: python о многих умных указателях позаботились автоматически.Что нужно сделать в моем случае?Должен ли я добавить дополнительные функции в C ++, которые принимают не смарт-указатели, которые просто оборачивают указатель в смарт-указатель и отправляют его в функцию, принимающую смарт-указатель?Кажется, в Python API есть довольно сложные правила относительно владения указателем.

class PythonQtWrapper_SomeClass : public QObject
{
   Q_OBJECT
public slots:
   SomeClass* new_SomeClass() { return new SomeClass(); }
   void delete_Mesh(SomeClass* obj) { delete obj; }
   SomeClass* static_SomeClass_build(int foo) {
       SomeClassP ack = SomeFactory::build(foo);
       return ?
   }
};

1 Ответ

1 голос
/ 14 марта 2012

У нас точно такая же проблема, и у нас пока нет отличного решения.

Ранее прибегали к добавлению вариантов функций, которые вместо этого возвращали необработанные указатели. Затем мы избавились от них и сейчас украшаем умные указатели в PythonQt, чтобы py-код мог вызывать .get () для них, чтобы получить необработанный указатель. Вот как я только что сделал первый экспериментальный переход на этот стиль: (с https://github.com/realXtend/naali/commit/e72cb827c7fcbaee27b8258e616ee7bd2835fbd7)

//Ptr conversions, not automatic but with an explicit call
int scenePtr_id = qRegisterMetaType<ScenePtr>("ScenePtr");
QObject* TundraDecorator::get(ScenePtr* self)
{
    return self->get();
}

Не уверен, что это безопасно, но, похоже, работает. Я очень заинтересован, если есть лучшие решения.

...