這是我的班級:
CGEGameModeBase類
{
公共:
虛擬void function call()= 0;
虛擬常量char * string return()= 0;
};
類CGEPYGameMode:public CGEGameModeBase,public boost::python::wrapper & lt;CGEPYGameMode & gt
{
公共:
虛擬void FunctionCall()
{
if(override f = this-& gt;get_override("FunctionCall "))
f();
}
虛擬常量char* StringReturn()
{
if(override f = this-& gt;get_override("StringReturn "))
返回f();
返回“呼叫失敗”;
}
};
增強包裝:
BOOST_PYTHON_MODULE(GEGameMode)
{
class _ & ltCGEGameModeBase,boost::non copy able & gt;(“CGEGameModeBase”,no _ init);
class _ & ltCGEPYGameMode,bases & ltCGEGameModeBase & gt& gt(“CGEPYGameMode”,no_init)
。def("FunctionCall ",& ampCGEPYGameMode::FunctionCall)
。def("StringReturn ",& ampCGEPYGameMode::string return);
}
python代碼:
導入GEGameMode
定義標識():
返回“阿爾法”
def NewGamePlay():
返回“NewAlpha”
def NewAlpha():
導入GEGameMode
導入工具
Alpha類(GEGameMode。CGEPYGameMode):
def __init__(self):
打印“制造新阿爾法!”
def函數調用(self):
吉蒂爾。Msg("這是功能測試Alpha!")
def StringReturn(self):
return“這是返回測試Alpha!”
返回Alpha()
現在我可以這樣調用第壹個函數:
const char* ident = extract<。const char * & gt(GetLocalDict()[" Ident "]());
const char * new gameplay = extract & lt;const char * & gt(GetLocalDict()[" new gameplay "]());
printf("加載腳本:%s\n ",ident);
CGEPYGameMode * m _ pGameMode = extract & lt;CGEPYGameMode * & gt(GetLocalDict()[new gameplay]());
然而,當我試圖將Alpha類轉換回它的基類(上面的最後壹行)時,我得到了壹個boost錯誤:
TypeError:沒有註冊的轉換器能夠從Alpha類型的Python對象中提取指向CGEPYGameMode類型類的C++指針
我在網上做了很多搜索,但是不知道如何將Alpha對象轉換成它的基類指針。我可以把它作為壹個對象,但更願意把它作為壹個指針,這樣壹些不支持python的代碼就可以使用它。有什麽想法嗎?
感謝python c++郵件列表中的Stefan,我錯過了
超級(阿爾法,自我)。__init__()
這意味著它從未創建父類。以為這是自動:D
我遇到的另壹個問題是將新的類實例保存為全局變量,否則它會因為超出範圍而被清除。
現在好開心