Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何返回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 - Fatal编程技术网

如何返回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++;反对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

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 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元表将为零。