<--!著作權foruok,轉載註明出處!--> 一個完整的例子
實驗了一個完整的例子。
在C++中產生一個類,註冊到lua。
從lua調用C++類的成員函數。
在Alternate.lua中寫了階乘函數factorial。
從C++中調用factorial。
Alternate.lua如下:
print("now in alternate.lua");
print("initial number of AxhSystem:"..AxhSystem:GetNumber());
AxhSystem:SetNumber(15);
print("Change the number from lua,new:"..AxhSystem:GetNumber());
print("Now Set message to 'Hello world'");
AxhSystem:SetMessage("Hello world");
print("AxhSystem:GetMessage return:"..AxhSystem:GetMessage());
print(" now, enter a number to change AxhSystem's number:");
num=io.read("*number");
print("you enter:"..num);
print("set to AxhSystem")
AxhSystem:SetNumber(num);
print("AxhSystem's new number="..AxhSystem:GetNumber());
function factorial(n)
if( n==0 ) then
return 1;
else
return n * factorial(n-1);
end
end
C++代碼如下:
class CAxhSystem
...{
public:
CAxhSystem():m_nNumber(0)
...{
memset(m_szMsg, 0, sizeof(m_szMsg));
}
~CAxhSystem()
...{
}
void SetNumber(int num)
...{
m_nNumber = num;
}
int GetNumber()
...{
return m_nNumber;
}
void SetMessage(const char * szMsg)
...{
if(szMsg)
_tcsncpy(m_szMsg, szMsg, 256);
}
char * GetMessage()
...{
return m_szMsg;
}
protected:
int m_nNumber;
char m_szMsg[256];
} ;
CAxhSystem g_system;
LuaStateOwner g_state;
LuaObject g_globalObj;
int InitLua()
...{
g_state->OpenLibs();
g_globalObj = g_state->GetGlobals();
return 0;
}
int RegisterObject()
...{
LuaObject axhmetaobj = g_globalObj.CreateTable("AxhMetaTable");
axhmetaobj.SetObject("__index", axhmetaobj);
//register functor
axhmetaobj.RegisterObjectDirect("SetNumber", (const CAxhSystem*)0, CAxhSystem::SetNumber);
axhmetaobj.RegisterObjectDirect("GetNumber", (const CAxhSystem*)0, CAxhSystem::GetNumber);
axhmetaobj.RegisterObjectDirect("SetMessage", (const CAxhSystem*)0, CAxhSystem::SetMessage);
axhmetaobj.RegisterObjectDirect("GetMessage", (const CAxhSystem*)0, CAxhSystem::GetMessage);
//get lua object
LuaObject luasys = g_state->BoxPointer(&g_system);
luasys.SetMetaTable(axhmetaobj);
g_globalObj.SetObject("AxhSystem", luasys);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
...{
InitLua();
RegisterObject();
g_state->DoFile("Alternate.lua");
LuaFunction<int> factorial = g_state->GetGlobal("factorial");
printf(" Now call 'factoral' in Alternate.lua, enter a number:");
int number;
scanf("%d", &number);
printf("You ennter %d, it's factorial=%d ", number, factorial(number));
return 0;
}
OK,到這裡已經可以在lua和c++之間做一些互動了,可以根據需要實現我們的目標了。
接下來我要好好學習lua了,不然沒辦法用它來寫複雜的邏輯。
<--!著作權foruok,轉載註明出處!-->