[C++-sig] python extended object to native c++ pointer

Mark Chandler admin at lodle.net
Mon Aug 31 13:51:04 CEST 2009


Im toying around with the idea to use python as an embedded scripting 
language for a project im working on and have got most things working. 
However i cant seem to be able to convert a python extended object back 
into a native c++ pointer.

So this is my class:

    class CGEGameModeBase
    {
    public:
        virtual void FunctionCall()=0;
        virtual const char* StringReturn()=0;
    };
    
    class CGEPYGameMode : public CGEGameModeBase, public 
boost::python::wrapper<CGEPYGameMode>
    {
    public:
        virtual void FunctionCall()
        {
            if (override f = this->get_override("FunctionCall"))
                f();
        }
    
        virtual const char* StringReturn()
        {
            if (override f = this->get_override("StringReturn"))
                return f();
    
            return "FAILED TO CALL";
        }
    };

Boost wrapping:

    BOOST_PYTHON_MODULE(GEGameMode)
    {
        class_<CGEGameModeBase, boost::noncopyable>("CGEGameModeBase", 
no_init);
    
        class_<CGEPYGameMode, bases<CGEGameModeBase> >("CGEPYGameMode", 
no_init)
            .def("FunctionCall", &CGEPYGameMode::FunctionCall)
            .def("StringReturn", &CGEPYGameMode::StringReturn);
    }

and the python code:

    import GEGameMode
    
    def Ident():
        return "Alpha"
        
    def NewGamePlay():
        return "NewAlpha"
    
    
    def NewAlpha():
        import GEGameMode
        import GEUtil
    
        class Alpha(GEGameMode.CGEPYGameMode):
            def __init__(self):
                print "Made new Alpha!"
    
            def FunctionCall(self):
                GEUtil.Msg("This is function test Alpha!")
    
            def StringReturn(self):
                return "This is return test Alpha!"
                
        return Alpha()


Now i can call the first to functions fine by doing this:

    const char* ident = extract< const char* >( GetLocalDict()["Ident"]() );
    const char* newgameplay = extract< const char* >( 
GetLocalDict()["NewGamePlay"]() );

    printf("Loading Script: %s\n", ident);
    CGEPYGameMode* m_pGameMode = extract< CGEPYGameMode* >( 
GetLocalDict()[newgameplay]() );


However when i try and convert the Alpha class back to its base class 
(last line above) i get an boost error:

    TypeError: No registered converter was able to extract a C++ pointer 
to type class CGEPYGameMode from this Python object of type Alpha

I have done alot of searching on the net but cant work out how to 
convert the Alpha object into its base class pointer. I could leave it 
as an object but rather have it as a pointer so some non python aware 
code can use it. Any ideas?


Better Formatted version: 
http://stackoverflow.com/questions/1355187/python-object-to-native-c-pointer



More information about the Cplusplus-sig mailing list