Boost.Python使用全局指针公开类

问题描述

我正在用C ++编写一个游戏,我想向其中添加一些动态加载的Python脚本。有一个称为GameEngine的全局服务,它是一个全局unique_ptr。我可以在代码的任何地方使用它来告诉游戏某些事情发生了。为了简化:

inline std::unique_ptr<class Game> GameEngine;
    
class Game
{
public:
    void printHello() { std::cout<<"Hello World"<<std::endl; }
};

稍后我用以下方法初始化指针:

GameEngine = std::make_unique<Game>();

我希望能够从我的Python脚本中通知游戏有关事件的信息,所以我想我将制作一些GameWrapper:

class GameWrapper
{
public:
    void printHello() { GameEngine->printHello(); }
};

并公开该类,例如:

BOOST_PYTHON_MODULE(MyGameModule)
{
    using namespace boost::python;
    class_<GameWrapper>("GameWrapper")
        .def("printHello",&GameWrapper::printHello)
        ;
}

还有我的Python脚本:

from MyGameModule import *

class Script():
    def execute(self):
        GameWrapper().printHello()

然后我想在C ++中通过以下方式调用该脚本:

Py_Initialize();
auto module = python::import("MyGameModule");
auto script = module.attr("Script")();
script.attr("execute")();

但是不幸的是,它崩溃了,因为从Python调用时指针为null。该设计基于Ron Penton MUD游戏编程书,但他在那里使用了SWIG(实际上对我而言不是100%可以理解的),因此我决定尝试使用Boost.Python。有什么方法可以使该指针可行并影响已加载的Python脚本中已经在运行的游戏?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)