2011-07-27 39 views
3

從我的研究看來,包裝保存指針類型的std :: vector似乎不是非常簡單。例如:wrap std :: vector <pointer*> in boost.python

std::vector<GameObject*> 

我已經看了提升蟒蛇vector_index_suite但它只是給我的運行時錯誤:

TypeError: No to_python (by-value) converter found for C++ type: GameObject*

我已經暴露的遊戲對象:

class_<GameObject>("GameObject") ... 

所以有根據我的理解,使用開箱即用的解決方案是不可能的。我必須做一些包裝?有人能幫我開始我應該開始的地方嗎?

回答

0

你還必須包裝你的GameObject類。除非你有成員對象的Python包裝器才能工作。如果你不想暴露類的成員,你可以忽略它們,只是有一個不透明的對象。

此外,boost :: python在共享指針上效果很好。這爲您提供安全內存處理的額外好處。任何機會,你可以將std::vector<GameObject*>更改爲std::vector<boost::shared_ptr<GameObject> >?這會工作得更好。

+0

感謝您的回答,是的,我已經暴露與Boost.Python的遊戲對象。它仍然不適用於矢量。我現在無法實現shared_ptr。你有其他建議如何導出矢量類? – mrmclovin

+0

也許它工作,如果我手動包裝它?任何提示如何? – mrmclovin

2

解決這個問題的方法是明確聲明你的類封裝器也適用於指針類型。

class_<GameObject, GameObject*>("GameObject") ...

1

不能發表評論@jkp但他暗示奏效了我。我的簡約案例:

RenderWorld.h

class RenderWorld { 
    public: 
     ... 
     void addEntity(RenderEntity* entity) {entities.push_back(entity);}; 
     std::vector<RenderEntity*> getEntities(void) {return entities;}; 
    private: 
     std::vector<RenderEntity*> entities; 
}; 

RenderEntity.h

class RenderEntity { 
    public: 
     int getID(void) {return 42;}; 
}; 

中的python-exportage.py.h(編譯爲exported.pyd)

BOOST_PYTHON_MODULE(exported) 
{ 
    class_<RenderWorld>("RenderWorld") 
     .def("addEntity", &RenderWorld::addEntity) 
     .def("getEntities", &RenderWorld::getEntities) 
    ; 

    class_<RenderEntity, RenderEntity*>("RenderEntity") 
     .def("getID", &RenderEntity::getID) 
    ; 

    class_<std::vector<RenderEntity*> >("PyVec") 
     .def(boost::python::vector_indexing_suite<std::vector<RenderEntity*> >()) 
    ; 
} 

我的Python會話:

>>> import exported 
>>> world = exported.RenderWorld() 
>>> world 
<exported.RenderWorld object at 0x00000000024A0E58> 
>>> e1 = exported.RenderEntity() 
>>> e1 
<exported.RenderEntity object at 0x000000000284DF48> 
>>> e1.getID() 
42 
>>> world.addEntity(e1) 
>>> world.getEntities() 
<exported.PyVec object at 0x000000000234B1B0> 
>>> world.getEntities()[0] 
<exported.RenderEntity object at 0x0000000002441F50> 
>>> world.getEntities()[0].getID() 
42 
>>> e1 == world.getEntities()[0] 
False 

亮點:該RenderEntity*將被包裝在其他物體。看看這些地址和最後一次檢查。從C++的角度來看它是合乎邏輯的,但不是在python域中。

相關問題