簡體   English   中英

使用Boost Python從C ++類創建派生的python類

[英]Create derived python class from a c++ class using 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();
};

我的此類的增強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是答案,但是我不知道如何實現它,文檔也沒有給出明確的示例。

嘗試這個:

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

您缺少超類初始化。 沒有它,對您的基類的使用實際上是無效的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM