我的应用程序在整个typedef中使用QSharedPointers,它通常返回一个指向该对象的智能指针,并且每个类都有一个附带的C++,以方便使用。
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 ?
}
};
发布于 2012-03-14 05:14:21
我们也遇到了同样的问题,而且还没有一个很好的解决方案。
早期的做法是添加函数的变体,而不是返回原始指针。然后我们去掉了它们,现在我在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();
}
我不确定这是否安全,但似乎是有效的。我非常感兴趣,如果有更好的解决方案。
https://stackoverflow.com/questions/8313651
复制相似问题