[C++-sig] python extended object to native c++ pointer (original) (raw)

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 { 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