2011-06-29 12 views
3

私のアプリケーションではbox2dを使用しています。クラスはb2Bodyです。プロパティーはvoid *userDataであり、そのメソッドはアクセスしています。換言すれば、私たちは物理的な身体に関するいくつかの追加情報をそこに保存することができます。私はそこにいくつかのクラスオブジェクトを格納したい:Pythonを使用してC++オブジェクトメンバポインタを取得します

MyClass *obj = new MyClass(); 
b2Body body; 
body.SetUserData(obj); 

私はPythonの中でユーザーデータを取得する必要があります!私はPythonでGetBodyUserDataを呼び出すときに私が空または「死んだ」オブジェクトを:(持って、今

MyClass *GetBodyUserData(b2Body &body) 
{ 
    void *userData = body.GetUserData(); 
    if (userData) return (MyClass*)userData; 

    std::cout << "Fail."; 
    return nullptr; 
} 

私は、スマートポインタを格納しようとしたinsted:私は、抽出されたポインタを返す関数のラッパーを書きました。純粋な1のそれはSetUserDataインターフェイスで許可されていない。

任意のアイデア?


UPD のpythonへのエクスポート:

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

あなたは何をしているのですか?どのようにポインタをPythonに渡していますか? –

+0

"Fail?"が出力されますか? – Maxpm

+0

@Maxpmいいえ、そうではありません。 – Ockonal

答えて

1

はちょうどそれをC-スタイルをしなければならない、すなわち、リターンしたい特定の項目と関数へのポインタを渡します。 C++オブジェクトはPythonオブジェクトと同じではありません。

また、PythonはあなたのC++オブジェクトの定義さえも持っていないので、メモリ内で同じように見えても、Pythonはその内部的な値と関数が何であるか分からないので、

ポインタは、オブジェクトのメモリアドレスを表す数値です。

myclassには、pythonから編集できるメンバー値があります。

あなたが関数にセットを定義して取得する必要があり

((MyClassの*)は、obj)設定後、Pythonの値をとるべきであり、設定された機能 - ((>この値に値がget関数が返すながら、 MyClass *)obj) - > value

Pythonで適切なデザインのMyClassを構築し、単にCスタイルの関数を呼び出すこともできます。

P.S.

私はPythonクラスの型をC++から定義することもできますが、関数を定義する方法と似ていますが、決してこれを試したことはありません。

私はこれがあなたを助けてくれることを願っています。

関連する問題