使用Boost Python

时间:2015-12-21 20:59:40

标签: python c++ c++11 boost-python

我有一个共享库,我用boost python创建了一堆类,我希望能够在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是答案,但我无法弄清楚如何实现它,文档并没有真正给出一个明确的例子。

1 个答案:

答案 0 :(得分:1)

试试这个:

       if (~(PORTD &(1<<0)) && PORTD &(1<<1) && ~(PORTD &(1<<2))) /// 0   1   0
        {
            PORTB=(1<<0)|(0<<1)|(0<<2)|(1<<3)|(0<<4)|(0<<5);
        }
        else if (~(PORTD &(1<<0)) && PORTD &(1<<1) && PORTD &(1<<2)) /// 0   1   1
        {
            PORTB=(0<<0)|(0<<1)|(0<<2)|(1<<3)|(0<<4)|(1<<5);
        }
        ...........

您错过了超类初始化。没有它,使用你的基类并不是真的有效。