使用 Boost Python 从 c++ class 创建派生的 python class
Create derived python class from a c++ class using Boost Python
我有一个共享库,我用 boost python 创建了一堆 classes,我希望能够从这些 classes 中继承 python。继承位似乎工作正常,但我无法在超级 class.
中调用方法
c++ class 定义:
class Game {
vector<pair<object, Listener*> > _listeners;
public:
Game();
virtual void assignListener(object listener);
vector<pair<object, Listener*> >& listeners();
};
我的提升 python 这个 class 的包装看起来像这样:
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())
您错过了 superclass 初始化。没有它,使用你的基础 class 是无效的。
我有一个共享库,我用 boost python 创建了一堆 classes,我希望能够从这些 classes 中继承 python。继承位似乎工作正常,但我无法在超级 class.
中调用方法c++ class 定义:
class Game {
vector<pair<object, Listener*> > _listeners;
public:
Game();
virtual void assignListener(object listener);
vector<pair<object, Listener*> >& listeners();
};
我的提升 python 这个 class 的包装看起来像这样:
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())
您错过了 superclass 初始化。没有它,使用你的基础 class 是无效的。