Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C+中的方法创建实例+;并将其传递给Python_Python_C++_Boost_Boost Python - Fatal编程技术网

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

使用C+中的方法创建实例+;并将其传递给Python,python,c++,boost,boost-python,Python,C++,Boost,Boost Python,我尝试创建一个Bythy/Cuth>的实例,将其传递到Test.Py的主命名空间中作为变量游戏,然后调用游戏。添加(e)< /C> >运行C++函数,将实体“代码> E添加到STD::vector中。但是,此代码会产生以下错误: unbound方法Boost.Python.function对象必须以游戏实例作为第一个参数调用(改为获取实体实例) (一些上下文:我想让Python创建实例,这些实例将被保存在一个容器中供C++运行,每一个滴答和更新。我想我几周前就已经工作了,但我回到它,显然它不起作

我尝试创建一个Bythy/Cuth>的实例,将其传递到Test.Py的主命名空间中作为变量游戏,然后调用<代码>游戏。添加(e)< /C> >运行C++函数,将实体“代码> E<代码>添加到STD::vector中。但是,此代码会产生以下错误:

unbound方法Boost.Python.function对象必须以游戏实例作为第一个参数调用(改为获取实体实例)

(一些上下文:我想让Python创建实例,这些实例将被保存在一个容器中供C++运行,每一个滴答和更新。我想我几周前就已经工作了,但我回到它,显然它不起作用了。我知道,源码控制)。


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


然而,发布的代码是正确的。您必须使用变量<代码>游戏编译.Pyd文件,实现您的错误,然后将其更改为<代码>游戏并编译C++文件,以测试它,而不必重新编译.Pyd文件,因此错误仍然存在。

< P>如果将主命名空间中的变量名设置为<代码>游戏,您将收到该错误,因为它将与类名相同

然而,发布的代码是正确的。您必须使用变量<代码>游戏编译.Pyd文件,实现您的错误,然后将其更改为<代码>游戏并编译C++文件,以测试它,而不必重新编译.Pyd文件,因此错误仍然存在。
#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);
}
#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;
}
from sfgame import *

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