如何返回C++;反对Lua5.2? 如何将C++对象返回到Lua?< /P> 我的C++代码如下: class MyClass { public: void say() { print("Hello\r\n"); } }; int test(lua_State* l) { MyClass* obj = new MyClass(); lua_pushlightuserdata(l, obj); return 1; } local a = MyClass:new() a:say() <--- OK, beacause I set metatable!! local b = test() b:say() <--- ERROR: attempt to index local 'b' (a userdata value) int test(lua_State* l) { MyClass** c = (MyClass**)lua_newuserdata(l, sizeof(MyClass*)); *c = new MyClass(); // we manage this luaL_setmetatable(l, "MyClass"); //assign MyClass metatable return 1; }
Lua测试如下:如何返回C++;反对Lua5.2? 如何将C++对象返回到Lua?< /P> 我的C++代码如下: class MyClass { public: void say() { print("Hello\r\n"); } }; int test(lua_State* l) { MyClass* obj = new MyClass(); lua_pushlightuserdata(l, obj); return 1; } local a = MyClass:new() a:say() <--- OK, beacause I set metatable!! local b = test() b:say() <--- ERROR: attempt to index local 'b' (a userdata value) int test(lua_State* l) { MyClass** c = (MyClass**)lua_newuserdata(l, sizeof(MyClass*)); *c = new MyClass(); // we manage this luaL_setmetatable(l, "MyClass"); //assign MyClass metatable return 1; },c++,lua,lua-5.2,C++,Lua,Lua 5.2,Lua测试如下: class MyClass { public: void say() { print("Hello\r\n"); } }; int test(lua_State* l) { MyClass* obj = new MyClass(); lua_pushlightuserdata(l, obj); return 1; } local a = MyClass:new() a:say() <--- OK, beacause I set met
class MyClass
{
public:
void say()
{
print("Hello\r\n");
}
};
int test(lua_State* l)
{
MyClass* obj = new MyClass();
lua_pushlightuserdata(l, obj);
return 1;
}
local a = MyClass:new()
a:say() <--- OK, beacause I set metatable!!
local b = test()
b:say() <--- ERROR: attempt to index local 'b' (a userdata value)
int test(lua_State* l)
{
MyClass** c = (MyClass**)lua_newuserdata(l, sizeof(MyClass*));
*c = new MyClass(); // we manage this
luaL_setmetatable(l, "MyClass"); //assign MyClass metatable
return 1;
}
我不应该迷失方向我不使用任何Lua绑定框架,我使用的是纯Lua库 ==更新1==== 感谢用户1520427的回答,但是
int test(lua_State* l)
{
MyClass** c = (MyClass**)lua_newuserdata(l, sizeof(MyClass*));
*c = new MyClass(); // we manage this
lua_getglobal(l, "MyClass");
lua_setmetatable(l, -2);
return 1;
}
我用Lua测试它
local b = test()
print( type(b) )
local meta = getmetatable(b)
for k,v in pairs(meta) do
print(" ", k, v)
end
Lua显示元表是正确的
userdata
say function: 00602860
new function: 00493665
但是lua仍然显示出同样的错误
b:say() <-- attempt to index local 'b' (a userdata value)
lua测试结果:
b:say() <-- attempt to call method 'say' (a nil value)
b:say() <-- calling 'say' on bad self
Lua测试结果:
b:say() <-- attempt to call method 'say' (a nil value)
b:say() <-- calling 'say' on bad self
b:say()。尝试以下方法:
int test(lua_state* l) {
MyClass** c = lua_newuserdata(l, sizeof(MyClass*)); // lua will manage the MyClass** ptr
*c = new MyClass(); // we manage this
luaL_getmetatable(l, "MyClass");
lua_setmetatable(l, -2);
return 1;
}
这是我的想法,但你明白了。您已经设置了析构函数,因此当Lua垃圾收集userdata时,它将调用您的\uu gc
函数,然后该函数将强制转换、取消引用和删除数据 感谢用户1520427和lhf
正确的代码如下所示:
class MyClass
{
public:
void say()
{
print("Hello\r\n");
}
};
int test(lua_State* l)
{
MyClass* obj = new MyClass();
lua_pushlightuserdata(l, obj);
return 1;
}
local a = MyClass:new()
a:say() <--- OK, beacause I set metatable!!
local b = test()
b:say() <--- ERROR: attempt to index local 'b' (a userdata value)
int test(lua_State* l)
{
MyClass** c = (MyClass**)lua_newuserdata(l, sizeof(MyClass*));
*c = new MyClass(); // we manage this
luaL_setmetatable(l, "MyClass"); //assign MyClass metatable
return 1;
}
Lua测试代码工作正常。我认为您还需要设置它的元表来定义它的方法;什么是方法
?而且,你的a
不应该工作;您是否正在使用某个Lua绑定框架将MyClass
绑定到Lua?如果您想像对Lua对象一样对其进行操作,userdata将无法工作。Walie~如果您不使用userdata,那么使用什么?@Flash Whoops,试试luaL\u getmetatable(l,“MyClass”)
而不是lua\u getglobal
@Flash您确定注册的函数正确吗?在l_register类中,我看不到有任何地方您实际给出了say
名称。如果注册不正确,请尝试luaL_setmetatable
,它将替换luaL_getmetatable
+lua_setmetatable
。我的lua show元表将为零。