使用Boost Python从C++类创建派生的python类
我有一个共享的lib,我用一堆类创建了boost python,我希望能够从python中的这些类继承。继承位似乎工作正常,但我无法在超类中调用方法。使用Boost Python从C++类创建派生的python类
C++类的定义:
class Game {
vector<pair<object, Listener*> > _listeners;
public:
Game();
virtual void assignListener(object listener);
vector<pair<object, Listener*> >& listeners();
};
我对这个类boost Python包装看起来是这样的:
BOOST_PYTHON_MODULE(libgla) {
using namespace boost::python;
...
class_<Game>("Game", init<>())
.def("assign_listener", &Game::assignListener);
...
};
我的Python测试代码看起来是这样的:
from libgla import Engine, Game, Window, ErrorListener, KeyListener
class CustomGame(Game):
def __init__(self):
self.assign_listener(KeyListener())
engine = Engine(ErrorListener())
engine.set_game(CustomGame())
engine.set_window(Window(1280, 1024, "test"))
engine.start()
验证码终止于assign_listener函数,出现以下错误:
Traceback (most recent call last):
File "app.py", line 9, in <module>
engine.set_game(CustomGame())
File "app.py", line 6, in __init__
self.assign_listener(KeyListener())
Boost.Python.ArgumentError: Python argument types in
Game.assign_listener(CustomGame, KeyListener)
did not match C++ signature:
assign_listener(Game {lvalue}, boost::python::api::object)
我做错了什么或者是这种提升python限制?
注:以下Python代码的工作,因为它应该
from libgla import Engine, Game, Window, ErrorListener, KeyListener
engine = Engine(ErrorListener())
game = Game()
game.assign_listener(KeyListener())
engine.set_game(game)
engine.set_window(Window(1280, 1024, "test"))
engine.start()
编辑1
我觉得instance_holder描述here是答案,但是我不能想出如何实现它并没有按文件真的没有一个明确的例子。
试试这个:
class CustomGame(Game):
def __init__(self):
Game.__init__(self)
self.assign_listener(KeyListener())
你失踪超初始化。没有它,使用你的基类是不是真的有效。
您能否请[编辑]解释为什么这段代码回答这个问题? –
感谢它的工作,我不敢相信我甚至没有考虑到这一点。我没有在python编程很久,这是正常的,你总是必须运行超级构造函数,即使它只是一个默认的? –
是boost :: python :: api :: object的KeyListener子项吗? –
mhh不,会导致问题吗?你的意思是我应该从boost :: python :: api :: object继承吗?因为我的印象是我所需要做的就是实现class_,boost python应该知道它。 –
我做了这么远(也许不记得),尝试做到这一点或方法“assignListener”必须接收KeyListener,而不是对象。它不能应用你的电话给你的方法 –