2015-12-21 48 views
0

我有一个共享的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是答案,但是我不能想出如何实现它并没有按文件真的没有一个明确的例子。

+0

是boost :: python :: api :: object的KeyListener子项吗? –

+0

mhh不,会导致问题吗?你的意思是我应该从boost :: python :: api :: object继承吗?因为我的印象是我所需要做的就是实现class_ ,boost python应该知道它。 –

+0

我做了这么远(也许不记得),尝试做到这一点或方法“assignListener”必须接收KeyListener,而不是对象。它不能应用你的电话给你的方法 –

回答

1

试试这个:

class CustomGame(Game): 
    def __init__(self): 
     Game.__init__(self) 
     self.assign_listener(KeyListener()) 

你失踪超初始化。没有它,使用你的基类是不是真的有效。

+0

您能否请[编辑]解释为什么这段代码回答这个问题? –

+0

感谢它的工作,我不敢相信我甚至没有考虑到这一点。我没有在python编程很久,这是正常的,你总是必须运行超级构造函数,即使它只是一个默认的? –