gpt4 book ai didi

python - 使用 Boost Python 从 C++ 类创建派生的 Python 类

转载 作者:行者123 更新时间:2023-11-28 05:54:51 24 4
gpt4 key购买 nike

我有一个共享库,它是用 boost python 创建的,里面有很多类,我希望能够在 python 中继承这些类。继承位似乎工作正常,但我无法调用父类(super class)中的方法。

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)

我是做错了什么还是这个 boost 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())

您缺少父类(super class)初始化。没有它,使用您的基类就不是真正有效的。

关于python - 使用 Boost Python 从 C++ 类创建派生的 Python 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34404224/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com