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代码在Lua中创建对象_Lua - Fatal编程技术网

从C代码在Lua中创建对象

从C代码在Lua中创建对象,lua,Lua,我想用lua中定义的函数创建一个代理类。所以,如果我有一个lua文件soldier.lua比如: function Agent:init() io.write("Agent init\n") if self then self.x = 4 self:test() end end function Agent:test() io.write("Agent test\n") end 从C代码中,我可以加载它,创建代理表,如下所示: // creat

我想用lua中定义的函数创建一个代理类。所以,如果我有一个lua文件
soldier.lua
比如:

function Agent:init()
   io.write("Agent init\n")
   if self then
      self.x = 4
      self:test()
   end
end

function Agent:test()
   io.write("Agent test\n")
end
从C代码中,我可以加载它,创建代理表,如下所示:

// create Agent class on Lua
lua_newtable( L );
lua_setfield(L, LUA_GLOBALSINDEX, "Agent");
// execute class file
auto ret = luaL_dofile( L, filename.c_str() );
现在我想从C创建一个伪对象
self
来调用
Agent:init
,a)self.x行调用一个C函数来注册数据。行self.test()正确调用lua函数代理:test。但我不能让它工作

例如:

有什么想法吗?

使用以下方法解决:

  • 执行lua文件后,在代理上设置元表
  • 调用文件函数时,使用
    Agent
    作为自己的伪对象:
在调用
lua\u dofile(…)
之后,我把:

lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
luaL_newmetatable( L, "Agent" );
lua_pushstring(L, "__newindex");
lua_pushcfunction( L, agent_newindex );
lua_settable( L, -3 );
lua_pushstring(L, "__index");
lua_pushcfunction( L, agent_index );
lua_settable( L, -3 );
lua_setmetatable( L, -2 );
然后,对函数
Agent:init
的调用通过以下方式完成:

lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getfield( L, -1, "init");
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
ret = lua_pcall( L, 1, 0, 0 );

“但我可以让它工作”那有什么问题吗@BartekBanachewicz傻我,修正:)。问题与答案
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
lua_getfield( L, -1, "init");
lua_getfield( L, LUA_GLOBALSINDEX, "Agent" );
ret = lua_pcall( L, 1, 0, 0 );