【问题标题】:tolua++: Adding lua functions to a C++ class that has been exported to Luatolua++:将 lua 函数添​​加到已导出到 Lua 的 C++ 类
【发布时间】:2011-01-09 23:46:49
【问题描述】:

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

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

假设我正在导出类 Foobar。

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

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

等等

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

我有以下问题:

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

【问题讨论】:

    标签: c++ lua tolua++


    【解决方案1】:

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

    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 表。当您创建 Foobar 类型的对象,然后对其调用 method1() 时,self 将成为该对象。因此,向 Foobar 表添加一个新方法 method3 将允许您执行 Foobar:method3() obj = Foobar:new(); obj:method3(),尽管前者会出错。因此,此答案适用于 tolua++。

    编辑:解决评论

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

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

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

    • 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()
    

    【讨论】:

    • 感谢您的解释。有一件事仍然不清楚 - 如何调用静态方法和如何调用实例之间的区别。我猜在名为 Foobar 的类上调用方法将是 Foobar:static_method() 和 foobarvar:instance_method() ?
    • 现有的 C++ 方法也可以被覆盖吗?有没有办法让 C++ 方法只读(即防止 C++ 方法被赋值覆盖?)
    • 是的,您可以用完全相同的方式覆盖现有的 c++ 方法,只需使用现有方法的名称即可。制作只读表并非易事,也不是万无一失的。见这里:lua-users.org/wiki/ReadOnlyTables
    猜你喜欢
    • 2012-01-11
    • 2013-07-28
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 2014-08-11
    • 2012-11-07
    相关资源
    最近更新 更多