C++类和函数注册到lua
#C++注册类和类成员函数到lua例子
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
}
#include "stdio.h"
#include "string.h"
class CLuaObject
{
public:
CLuaObject()
{
nObjId = 1;
strcpy(name, "LuaObject");
};
~CLuaObject() {};
public:
void Reset()
{
nObjId = 1;
strcpy(name, "LuaObject");
}
int GetObjId()
{
return nObjId;
}
char* GetName()
{
return name;
}
public:
int nObjId;
char name[32];
};
static int NewCLuaObject(lua_State* L)
{
CLuaObject* pLuaObject = (CLuaObject*)lua_newuserdata(L, sizeof(CLuaObject));
pLuaObject->Reset();
// 设置元表
luaL_getmetatable(L, "LuaObj");
lua_setmetatable(L, -2);
return 1;
}
static int GetObjId(lua_State* L)
{
CLuaObject* pLuaObject = (CLuaObject*)luaL_checkudata(L, 1, "LuaObj");
int nObjId = pLuaObject->GetObjId();
lua_pushnumber(L, nObjId);
return 1;
}
static int GetName(lua_State* L)
{
CLuaObject* pLuaObject = (CLuaObject*)luaL_checkudata(L, 1, "LuaObj");
char* name = pLuaObject->GetName();
lua_pushstring(L, name);
return 1;
}
static struct luaL_Reg arrayFunc[] =
{
{"NewLuaObj", NewCLuaObject},
{NULL, NULL},
};
static struct luaL_Reg ObjFunc[] =
{
{ "GetObjId", GetObjId },
{ "GetName", GetName },
{ NULL, NULL },
};
int main()
{
lua_State* L = luaL_newstate();
if (!L)
return 0;
luaL_openlibs(L);
//创建一个metatable
luaL_newmetatable(L, "LuaObj");
//复制一份metatable 并压栈
lua_pushvalue(L, -1);
//将栈顶的metatable中的__index 元方法 赋值位于栈位置为-2的 metatable ===> metatable.__index = metatable;
lua_setfield(L, -2, "__index");
luaL_setfuncs(L, ObjFunc, 0);
//注册 函数NewCLuaObject 为NewLuaObj 到全局环境中
lua_pushcfunction(L, NewCLuaObject);
lua_setglobal(L, "NewLuaObj");
int ret = luaL_loadfile(L, "test.lua");
if (ret != 0)
{
printf("%s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
ret = lua_pcall(L, 0, 0, 0);
if (ret != 0)
{
printf("%s\n", lua_tostring(L, -1));
lua_pop(L, 1);
}
return 1;
}
####test.lua
local luaObj = NewLuaObj();
local Id = luaObj:GetObjId();
local name = luaObj:GetName();
print(Id, name);
输出结果:1 LuaObject