2009-08-30 78 views
2

即時通訊的想法是使用python作爲嵌入式腳本語言,用於一個項目即時通訊工作,並獲得大部分工作。但是我似乎無法將python擴展對象轉換回原生C++指針。python對象本地C++指針

所以這是我的課:

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_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); 
} 

和Python代碼:

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() 

現在我可以調用第一個地精功能做這個:

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]()); 

但是當我嘗試和轉換阿爾法類回其基類(上面最後一行)我得到一個增壓誤差:

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

我已經做了很多在網絡上搜索,但不能工作如何將Alpha對象轉換爲其基類指針。我可以把它作爲一個對象,而是把它作爲一個指針,這樣一些非python感知的代碼就可以使用它。有任何想法嗎?

回答

2

感謝斯特凡從Python C++ mailling名單,我是從構造函數調用意味着它從未父類缺少

super(Alpha, self).__init__() 

。認爲這將是自動的:D

我只有其他問題是保存新的類實例作爲全局變量,否則它得到清理,因爲它超出了範圍。

太高興了,現在

0

嗯,我不確定它是否會幫助你,但我在Lua中遇到了與腳本相同的問題。我們從Lua創建對象,並希望一些C++代碼通過指針處理對象。我們做了以下工作:

  • 所有對象的東西都是用C++編寫的,包括構造函數,析構函數和工廠方法;
  • lua代碼正在調用工廠方法來創建對象。這個工廠的方法1)給對象一個唯一的ID號,2)在C++ map中註冊它,它將ID號映射到本地指針;
  • 因此,無論何時lua傳遞一個指向C++代碼的指針,它都會給出一個對象ID,而C++代碼會根據ID查找實際指針。
+0

這將是確定的,但我希望腳本擴展,這使得這個不太好 – Lodle 2009-08-31 10:50:21

0

可能不是你要找的答案,但看一看ChaiScript在你的C++應用程序中嵌入。

根據他們的網站,

ChaiScript is the first and only scripting language designed from the ground up with C++ compatibility in mind. It is an ECMAScript-inspired, embedded functional-like language.

ChaiScript has no meta-compiler, no library dependencies, no build system requirements and no legacy baggage of any kind. At can work seamlessly with any C++ functions you expose to it. It does not have to be told explicitly about any type, it is function centric.

With ChaiScript you can literally begin scripting your application by adding three lines of code to your program and not modifying your build steps at all.

+0

看起來不錯的對象。只需要能夠快速包裝C++對象的東西。我今晚給它去吧 – Lodle 2009-08-31 11:07:21

+0

它的好,除了我不能擴展類,然後與C++分享該指針:( – Lodle 2009-08-31 11:45:08

+0

Lodle-作爲ChaiScript的開發人員之一,我很好奇,如果你可以闡述你需要做什麼與擴展類?您可以創建和共享C++和ChaiScript之間的回調函數,如果這可能會滿足您的需求。 – lefticus 2009-08-31 20:59:29