用C++中的方法创建实例并将其传递到Python

2024-09-27 21:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试创建Game的实例,将其传递到测试.py作为变量^ {< CD2> },然后调用^ {< CD3> }来运行将将实体^ ^ {CD4}}添加到STD::vector中的C++函数。但是,此代码会产生错误:

unbound method Boost.Python.function object must be called with Game instance as first argument (got Entity instance instead)

(一些上下文:我试图让Python创建实例,这些实例将保存在容器中供C++运行,通过每个滴答和更新)。几周前我还以为它还可以用,但后来我又想起来了,显然它不起作用——我知道,是源代码管理。)

#include <vector>

class Entity{
public:
    Entity(){}
    Entity(float x, float y){}
};

class Game{
public:
    Game();
    void add(Entity* entity);
private:
    std::vector<Entity*> objects_;
};

Game::Game(){
}

void Game::add(Entity* entity){
    objects_.push_back(entity);
}

在主.cpp公司名称:

#include <iostream>
#include <boost/python.hpp>
#include "Game.h"
#include "Entity.h"
using namespace boost::python;

BOOST_PYTHON_MODULE(sfgame){
    class_<Game>("Game")
        .def("add", &Game::add)
        ;
    class_<Entity>("Entity", init<float, float>())
        ;
}

int main(){
    PyImport_AppendInittab("sfgame", &initsfgame);
    Py_Initialize();

    object main_module = import("__main__");
    object main_namespace = main_module.attr("__dict__");

    import("sfgame");
    Game* game = new Game();

    try{
        main_namespace["game"] = ptr(game);
        exec_file("test.py", main_namespace);
    }
    catch (const boost::python::error_already_set &){
        PyObject *ptype, *pvalue, *ptraceback;
        PyErr_Fetch(&ptype, &pvalue, &ptraceback);
        std::string error;
        error = boost::python::extract<std::string>(pvalue);
        std::cout << error << std::endl;
    }

    delete game;
    system("PAUSE");
    return 0;
}

在测试.py公司名称:

from sfgame import *

e = Entity(5,5)
game.add(e)

Tags: 实例pyaddgameincludemainerrorfloat
1条回答
网友
1楼 · 发布于 2024-09-27 21:23:31

如果将主命名空间中的变量名设置为Game,则会收到该错误,因为它与类名相同。你知道吗

但是,张贴的代码是正确的。您必须使用变量^ {< CD1> }编译.pID文件,实现您的错误,然后将其更改为^ {CD3}},并编译C++文件以测试它,而不必重新编译.pID文件,因此错误仍然存在。你知道吗

相关问题 更多 >

    热门问题