从我的研究来看,包含指针类型的std :: vector似乎并不是一件容易的事。例如:
std::vector<GameObject*>
我看过boost python vector_index_suite,但它只是给了我运行时错误:
TypeError:找不到C ++类型的to_python(by-value)转换器: 游戏对象*
我已经曝光了GameObject:
class_<GameObject>("GameObject") ...
所以我的理解是开箱即用的解决方案是不可能的。我必须做一些包装?有人可以帮我解决一下我应该从哪里开始吗?
答案 0 :(得分:2)
解决此问题的方法是明确声明您的类包装器也适用于指针类型。
class_<GameObject, GameObject*>("GameObject") ...
答案 1 :(得分: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域中则不然。
答案 2 :(得分:0)
您还必须包装GameObject
课程。只有成员对象的Python包装器才会生效。如果您不想公开该类的成员,可以省略它们,并且只有一个不透明的对象。
另外,boost :: python在共享指针方面效果很好。这为您提供了安全内存处理的额外好处。您是否有机会将std::vector<GameObject*>
更改为std::vector<boost::shared_ptr<GameObject> >
?这会更好。