2011-11-29 7 views
0

私のアプリはオブジェクトを返すのではなく、通常はスマートポインタを返し、すべてのクラスには便宜のために付随するtypedefがあるC++ API全体でQSharedPointersを使います。PythonQtを使ったスマートポインタ

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

これはうまくいったが、私のデザインはPythonQtの統合を処理するように変更する必要がある場合、私はどのように/思ったんだけど。たとえば、PythonQtWrapperではポインタから何を返すべきですか?私がPythonでポインターを扱っている場合、どのように普通のポインターではなくスマートポインターをとる他の関数を呼び出すことができますか? Smartポインタを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

私たちはまったく同じ問題を抱えていますが、まだ大きな解決策はありません。

代わりに、生ポインタを返したfuncsの変形を追加することに依っていました。それから、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(); 
} 

がわからない:これは私がちょうどそのスタイルに最初の実験的なスイッチを作った方法です。より良い解決策があれば、非常に興味があります。

関連する問題