不能發表評論@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域中。
c++
感謝您的回答,是的,我已經暴露與Boost.Python的遊戲對象。它仍然不適用於矢量。我現在無法實現shared_ptr。你有其他建議如何導出矢量類? –
mrmclovin
也許它工作,如果我手動包裝它?任何提示如何? – mrmclovin