2011-06-29 57 views
3

我在我的應用程序中使用box2d。它有一個類b2Body。它有一個財產void *userData及其訪問方法。換句話說:我們可以在那裏存儲一些關於物理體的附加信息。我想存儲有一些類對象:使用Python檢索C++對象成員指針

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

現在我要進去蟒用戶數據!我寫了一個函數封裝程序返回提取的指針:

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

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

現在,當我打電話GetBodyUserData在python我有一個空或「死」對象:(

我試圖存儲智能指針insted的一個純粹的,但它不是由SetUserData接口允許的。

任何想法?


UPD 導出到Python:

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

你在做什麼非常好,C++明智。你如何將指針傳遞給Python? –

+0

它輸出「失敗?」 – Maxpm

+0

@Maxpm不,它沒有。 – Ockonal

回答

1

你只需做C風格,即指針傳遞與回報功能所需的特定項目。 C++對象與python對象不一樣。

另外Python甚至沒有定義你的C++對象,所以即使它們在內存中看起來相同,python也可以使用它,因爲它不知道它的內部值和函數是什麼。

切記指針只是一個代表對象內存地址的數字。

所以說你的myclass有一個你想能夠從python編輯的成員值。

您需要定義一個set和get功能

設定的功能應該採取一個Python值,然後設置((MyClass的*)目標文件) - >值,該值,而get函數將返回(( MyClass *)obj) - >值

你也可以在python中構建一個MyClass,它具有適當的設計,並且只需調用C風格的函數。

P.S.

我相信也可以從C++定義一個python類類型,類似於你如何定義函數,但是我從來沒有嘗試過這個。

我希望這可以幫助你。