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

时间:2011-12-02 17:09:16

标签: c++ lua lua-c++-connection

我一直在研究如何将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 ++之间绑定的限制/我如何绑定这两种语言?

3 个答案:

答案 0 :(得分:0)

认为我理解这个问题,并且可能对解决方案有所了解。从技术上讲,lua Monster'class'和C ++ Monster类之间没有联系。当你在给定的lua对象上调用lua'成员函数'时,它不知道C ++中特定的Monster对象。如果要调用C ++对象的非静态方法,则不能使用lua C函数来执行此操作。你需要在你的lua对象上附加一个用户数据,它有一个指向C ++对象的指针(要非常小心对象的生命周期 - 你必须使用full-userdata并使用C函数覆盖lua中的__gc) C ++对象)。在这种情况下,您可以在Monster类上声明一个需要此userdata的私有静态C ++方法,然后使用给定的参数转换指针并为此特定C ++怪物对象调用非静态成员函数。 (我希望我理解你的问题,我的答案写得非常清楚。)

答案 1 :(得分:0)

写作时

function Monster:pounce(howhigh, bonus)

这是

的快捷方式
Monster.pounce = function(self, howhigh, bonus)

显然是通过

来调用它
Monster.pounce(badguy, 5, 1);

正如你所做的那样。

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

我必须承认我没有完全获得你链接的代码,但假设某个怪物的方法被metatable访问,你可以在该metatable中插入方法pounce

答案 2 :(得分:-3)

无法直接使用其所有参数调用C-Object / Function。你必须在你的Lua-State中注册一个C函数。这个功能必须这样:

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

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

函数的注册很简单,用两行代码完成:

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

您可以在本书“this chapter”的programming in lua中找到更多相关信息。

你想要做的事情,实现一个Lua-Object有点复杂,因为你必须注册一个metatable来创建一个Lua对象,但你的Lua到C接口仍然是解释类型的函数。

您还可以在Roberto Ierusalimschy的书中chapter 28

精益实施Lua-Object

我希望这会对你有所帮助

相关问题