#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