使用 Lua C API,我Object向 Lua 注册了一个简单的类,如下所示:
// My C++ Object class
class Object {
private:
double x;
public:
Object(double x) : x(x){}
};
// Create and return instance of Object class to Lua
int object_new(lua_State* L)
{
double x = luaL_checknumber(L, 1);
*reinterpret_cast<Object**>(lua_newuserdata(L, sizeof(Object*))) = new Object(x);
luaL_setmetatable(L, "Object");
return 1;
}
// Functions to register to Lua
const luaL_Reg functions[] =
{
{"new", object_new},
{nullptr, nullptr}
};
// Register the Object class to Lua
luaL_newmetatable(L, "Object");
luaL_setfuncs(L, functions, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
Run Code Online (Sandbox Code Playgroud)
在我的 Lua 脚本中,以下内容工作得很好:
// Works!
my_object = Object.new(42)
Run Code Online (Sandbox Code Playgroud)
但是,我希望能够做到这一点(即省略该.new部分):
// Fail :(
my_object = Object(42)
Run Code Online (Sandbox Code Playgroud)
但是当我执行Lua脚本时,出现以下错误:
...attempt to call a table value (global 'Object').
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以注册 C++ 类,如果我们不提供函数名,则调用构造函数?为了完成这项工作我错过了什么?这对于临时对象特别有用。
谢谢!
您应该检查luaL_newmetatable的返回以仅注册您的元方法一次。
你可以替换luaL_setmetatable为luaL_newmetatable,这样你的代码就兼容Lua 5.1,你可以将元表注册嵌入到构造函数中,它的工作原理是相同的(除了额外的lua_setmetatable)。
对于构造函数,只需注册一个函数即可。元表应该管理一个实例,而不是他的创建。
不要忘记添加解构函数 ( __gc ) 来释放分配的 C++ 类实例。
最后,您只需注册Object在第一次调用时创建元表的函数。
#define LUA_META_OBJECT "Object"
class Object {
private:
double x;
public:
Object(double x) : x(x){}
};
static int object_free(lua_State* L)
{
delete *static_cast<Object**>(luaL_checkudata(L, 1, LUA_META_OBJECT));
return 0;
}
static int object_new(lua_State* L)
{
const lua_Number x = luaL_checknumber(L, 1);
*static_cast<Object**>(lua_newuserdata(L, sizeof(Object*))) = new Object(x);
if(luaL_newmetatable(L, LUA_META_OBJECT)){
static const luaL_Reg functions[] =
{
{"__gc", object_free},
{nullptr, nullptr}
};
luaL_setfuncs(L, functions, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
}
lua_setmetatable(L, -2);
return 1;
}
...
lua_register(L, "Object", object_new);
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2605 次 |
| 最近记录: |