繁体   English   中英

将成员函数添加到绑定到Lua的C ++类中

[英]Adding member function to a C++ class bound to Lua

我一直在研究如何将C ++类绑定到Lua以便在游戏引擎中使用,并且遇到了一个有趣的问题。 我一直在以下网站上关注该教程: http : //tinyurl.com/d8wdmea 学习完本教程后,我意识到他建议使用以下代码:

local badguy = Monster.create();
badguy.pounce = function(self, howhigh, bonus)
    self.jumpbonus = bonus or 2;
    self:jump(howhigh);
    self:rawr();
end
badguy:pounce(5, 1);

只会将pounce函数添加到Monster的特定实例。 因此,我将他建议的脚本更改为以下内容:

function Monster:pounce(howhigh, bonus)
    print("in pounce function");
    print(bonus);
    self.jumpbonus = bonus or 2
    self:jump(howhigh);
    self:rawr();
end
local badguy = Monster.create();
badguy:pounce(5,1);

但是,当我调用pounce函数时,脚本会中断。 经过进一步测试后,我能够成功调用pounce函数的唯一方法是通过将该函数作为Monster类的静态成员进行调用(该函数的代码保持不变):

Monster.pounce(badguy,5,1);

语法上,badguy:pounce(5,1)是正确的,但没有正确调用该函数。 我是在做错什么,还是lua和c ++之间的绑定限制/我如何绑定这两种语言?

我理解这个问题,并且可能对解决方案有所了解。 从技术上讲,lua Monster'class'和C ++ Monster class之间没有链接。 在给定的lua对象上调用lua'成员函数'时,它不了解C ++中的特定Monster对象。 如果要调用C ++对象的非静态方法,则不能使用lua C函数来执行此操作。 您可能需要将用户数据附加到lua对象的某个地方,该对象具有指向C ++对象的指针(对对象生存期要非常小心-您必须使用完整用户数据,并使用销毁C函数的函数覆盖lua中的__gc C ++对象)。 在这种情况下,可以在需要该用户数据的Monster类上声明一个私有的静态C ++方法,然后强制转换指针并使用给定的参数为此特定C ++ Monster对象调用非静态成员函数。 (希望我能理解您的问题,并且我的回答写得足够清楚。)

当你写

function Monster:pounce(howhigh, bonus)

这是

Monster.pounce = function(self, howhigh, bonus)

所以显然是这样称呼的

Monster.pounce(badguy, 5, 1);

如你所做的那样。

但是,您想做一些不同的事情:从C ++模块中,获得一个名为Monster的表。 您不想操作此表本身,因为它(仅?)包含名为create的条目, monster的构造函数。

我必须承认,我并没有完全获得链接到的代码,但是假设一个metatable访问一个Monster的方法,则可以在该metatable中插入pounce方法。

不能直接使用其所有参数调用C对象/函数。 您必须将C函数注册到Lua状态。 该函数必须这样看:

static int myfunc (lua_State *L) {
  // your code
  return X;  /* X = number of results */
}

该函数仅接收Lua-State作为参数。 Luafunction调用的所有参数都放在lua堆栈上。 然后,您必须从堆栈中弹出并使用它调用C ++方法。

函数的注册非常简单,只需两行代码即可完成:

lua_pushcfunction(l, myfunc);
lua_setglobal(l, "myfuncnameinlua");

您可以在《 lua编程 》一书的这一章中找到有关信息的更多信息。

要实现Lua对象,您要做的事情有些复杂,因为您必须注册一个元表才能创建Lua对象,但是Lua to C接口仍然是上述功能。

您还可以在Roberto Ierusalimschy在第28章的书中倾向于实现Lua-Object。

我希望这能帮到您

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM