gpt4 book ai didi

c++ - tolua++:将 lua 函数添​​加到已导出到 Lua 的 C++ 类

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:05 26 4
gpt4 key购买 nike

我正在使用 tolua++ 将一些 C++ 类导出到 Lua。

我的理解是每个类都是在 lua 端作为 lua 表“实现”的。因此,我想知道是否可以在C++对象表中添加新的(Lua)方法,从而达到为C++类添加新方法的效果。

假设我正在导出 Foobar 类。

Foobar 的方法将在 Lua 中访问如下:

Foobar:method1()
Foobar:method2()
...

等等

我希望能够向 Foobar 表“对象”添加新方法(newmethod1 和 newmethod2)

我有以下问题:

  1. 是否可以按照我上面描述的方式“扩展”导出的 C++ 对象的功能?
  2. 如何向 Foobar 表添加新函数? (我对 Lua 比较陌生)

最佳答案

是的,可以向现有的导出类添加新方法。

Foobar 只是一个普通表格,因此您可以像附加任何其他表格一样将方法附加到它上面。 [1]

Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end

现在您可以:

Foobar:extra_method(1,2)

1 2将被显示。

[1] tolua++ 的工作方式有些奇怪。它为每个类创建一个主表,也就是您所看到的 Foobar,它包含该类的静态成员函数(例如 Foobar:new())类的实例成员函数(例如 Foobar:method1() 可能是什么)。 lua中的:操作符是语法糖; a:b() 转换为 a.b(a)。这意味着当您调用 Foobar:new() 时,它被转换为 Foobar:new(Foobar),因此 self 参数是 Foobar table 。当您创建一个 Foobar 类型的对象,然后对其调用 method1() 时,self 将成为该对象。因此,向 Foobar 表添加一个新方法 method3 将允许您执行 Foobar:method3() and obj = Foobar:新的(); obj:method3(),虽然前者会报错。因此,此答案适用于 tolua++。

编辑:处理评论

让我在这里使用实际代码。因此,假设我们有一个 Foobar 的类声明,如下所示:

class Foobar {
public:
void method1();
static void method2();
};

当tolua++为这个类生成lua绑定(bind)代码时,它会给你一个包含以下方法的表

  • new() - 调用 Foobar:new() 以创建 Foobar 的实例。
  • delete() - 调用 instance:delete() 以销毁 Foobar 的一个实例。
  • method1() - 调用 instance:method1() 以在实例上运行 method1。
  • method2() - 调用 Foobar:method2() 来运行 method2。

但是,tolua++ 实际上并没有使用两个不同的表(一个用于应该附加到类本身的方法,另一个用于该类实例的方法)。相反,它将两者合并在一起,因此可以运行 Foobar:method1()instance:new()... 即使方法不应该是这样用过的。因此,静态方法的使用方式与实例方法的使用方式没有区别。在句法上,它也是一样的。 (个人感觉这是tolua++的问题。)

如果你正在寻找一个例子,这里是你应该如何从 lua 中调用这些函数:

obj = Foobar:new()
print( obj:method1() )
obj:delete()

关于c++ - tolua++:将 lua 函数添​​加到已导出到 Lua 的 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4642619/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com