C++类对象与Lua之间的交互
C语言与Lua进行交互,我们可以相对轻易的做到,但在实际应用中我们更加偏向于使用C++与Lua进行交互,面向对象编程。
关于C语言与Lua之间的调用交互实例可参考以下文章:
https://ufgnix0802.blog.csdn.net/article/details/125137333
https://ufgnix0802.blog.csdn.net/article/details/125193301
https://ufgnix0802.blog.csdn.net/article/details/125287026
这里不写过多注释进行阐释。
main.cpp
#include <iostream>
#include <string>
#include "lua.hpp"
#define LUA_CLASS_A "LUA_CLASS_A"
class A {
public:
bool Init(int a, const char* str) {
m_a = a;
m_str = str;
return true;
}
bool Print() {
std::cout << "str:" << m_str
<< " a:" << m_a << std::endl;
return true;
}
bool UnInit() {
std::cout << "UnInit" << std::endl;
return true;
}
private:
int m_a;
const char* m_str;
};
extern "C" {
static int InitA(lua_State* L) {
A* pA = (A*)luaL_checkudata(L, 1, LUA_CLASS_A);
int a = luaL_checkinteger(L, 2);
const char* str = luaL_checkstring(L, 3);
pA->Init(a, str);
lua_pop(L, 3);
return 0;
}
static int UnInitA(lua_State* L) {
A* pA = (A*)luaL_checkudata(L, 1, LUA_CLASS_A);
pA->UnInit();
lua_pop(L, 1);
return 0;
}
static int PrintA(lua_State* L) {
A* pA = (A*)luaL_checkudata(L, 1, LUA_CLASS_A);
pA->Print();
lua_pop(L, 1);
return 0;
}
static int CreateA(lua_State* L) {
A* pA = (A*)lua_newuserdata(L, sizeof(A));
luaL_setmetatable(L, LUA_CLASS_A);
return 1;
}
}
static const luaL_Reg AFuncs[] = {
{"Init", InitA},
{"__gc", UnInitA},
{"PrintA",PrintA},
{NULL, NULL}
};
static void CreateMetaTable(lua_State* L) {
luaL_newmetatable(L, LUA_CLASS_A);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
luaL_setfuncs(L, AFuncs, 0);
lua_pop(L, 1);
}
int main(int argc, char** argv) {
lua_State* L = luaL_newstate();
luaL_openlibs(L);
CreateMetaTable(L);
lua_pushcfunction(L, CreateA);
lua_setglobal(L, "CreateA");
if (luaL_dofile(L, "main.lua")) {
printf("%s\n", lua_tostring(L, -1));
}
lua_close(L);
return EXIT_SUCCESS;
}
main.lua
local A = CreateA()
A:Init(1234,"hello")
A:PrintA()
输出结果
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)