从 LUA 脚本调用 C++ class 函数
Calling C++ class function from LUA script
我正在尝试学习如何使用 lua/luabridge 调用 class 的成员函数,但我遇到了一些问题:
这里是简单的测试class:
class proxy
{
public:
void doSomething(char* str)
{
std::cout << "doDomething called!: " << str << std::endl;
}
};
以及使用它的代码:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
proxy p;
luabridge::getGlobalNamespace(L)
.beginClass<proxy>("proxy")
.addFunction("doSomething", &proxy::doSomething)
.endClass();
std::string filename("test.lua");
if (luaL_dofile(L, filename.c_str()) || lua_pcall(L, 0, 0, 0)) {
std::cout << "Error: script not loaded (" << filename << ")" << std::endl;
L = 0;
return -1;
}
return 0;
}
最后,lua 脚本:
proxy:doSomething("calling a function!")
这里可能有几个错误,但我特别想做的是从 lua 脚本调用 proxy
实例的成员函数,就好像我在调用:
p.doSomething("calling a function!");
我知道有很多类似的问题,但是 none 到目前为止我发现直接回答了我的问题。
目前连脚本都没有load/execute所以有点纳闷
事实证明,我不得不将代码更改为:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
proxy p;
luabridge::getGlobalNamespace(L)
.beginClass<proxy>("proxy")
.addFunction("doSomething", &proxy::doSomething)
.endClass();
std::string filename("test.lua");
if (luaL_dofile(L, filename.c_str())) {
std::cout << "Error: script not loaded (" << filename << ")" << std::endl;
L = 0;
return -1;
}
// new code
auto doSomething = luabridge::getGlobal(L, "something");
doSomething(p);
return 0;
}
并更改脚本:
function something(e)
e:doSomething("something")
end
这实际上对我来说效果更好。该脚本无法运行,因为 lua 堆栈对代理实例一无所知,我不得不直接调用 lua 函数,该函数又调用 class成员函数。
我不知道是否有更简单的方法,但这对我来说已经足够了。
我正在尝试学习如何使用 lua/luabridge 调用 class 的成员函数,但我遇到了一些问题:
这里是简单的测试class:
class proxy
{
public:
void doSomething(char* str)
{
std::cout << "doDomething called!: " << str << std::endl;
}
};
以及使用它的代码:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
proxy p;
luabridge::getGlobalNamespace(L)
.beginClass<proxy>("proxy")
.addFunction("doSomething", &proxy::doSomething)
.endClass();
std::string filename("test.lua");
if (luaL_dofile(L, filename.c_str()) || lua_pcall(L, 0, 0, 0)) {
std::cout << "Error: script not loaded (" << filename << ")" << std::endl;
L = 0;
return -1;
}
return 0;
}
最后,lua 脚本:
proxy:doSomething("calling a function!")
这里可能有几个错误,但我特别想做的是从 lua 脚本调用 proxy
实例的成员函数,就好像我在调用:
p.doSomething("calling a function!");
我知道有很多类似的问题,但是 none 到目前为止我发现直接回答了我的问题。
目前连脚本都没有load/execute所以有点纳闷
事实证明,我不得不将代码更改为:
int main()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);
proxy p;
luabridge::getGlobalNamespace(L)
.beginClass<proxy>("proxy")
.addFunction("doSomething", &proxy::doSomething)
.endClass();
std::string filename("test.lua");
if (luaL_dofile(L, filename.c_str())) {
std::cout << "Error: script not loaded (" << filename << ")" << std::endl;
L = 0;
return -1;
}
// new code
auto doSomething = luabridge::getGlobal(L, "something");
doSomething(p);
return 0;
}
并更改脚本:
function something(e)
e:doSomething("something")
end
这实际上对我来说效果更好。该脚本无法运行,因为 lua 堆栈对代理实例一无所知,我不得不直接调用 lua 函数,该函数又调用 class成员函数。
我不知道是否有更简单的方法,但这对我来说已经足够了。