我的应用程序在整个 C++ API 中使用 QSharedPointers,它通常不返回一个对象,而是返回一个指向它的智能指针,并且为方便起见,每个类都有一个附带的 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 ?
}
};
最佳答案
我们遇到了完全相同的问题,但还没有很好的解决方案。
早期采用的是添加返回原始指针的函数变体。然后我们摆脱了那些,现在正在 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();
}
我不确定这是否安全,但似乎有效。如果有更好的解决方案,我非常感兴趣。
关于c++ - PythonQt 的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313651/