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
托卢亚++;:将lua函数添加到C++;类,该类已导出到Lua 我使用TROUA++将一些C++类导出到Lua._C++_Lua_Tolua++ - Fatal编程技术网

托卢亚++;:将lua函数添加到C++;类,该类已导出到Lua 我使用TROUA++将一些C++类导出到Lua.

托卢亚++;:将lua函数添加到C++;类,该类已导出到Lua 我使用TROUA++将一些C++类导出到Lua.,c++,lua,tolua++,C++,Lua,Tolua++,我的理解是,每个类都是在lua端“实现”的,作为一个lua表。我想知道,是否可以将新的(LUA)方法添加到C++对象表中,这样我就可以实现向C++类添加新方法的效果。 假设我正在导出类Foobar Foobar的方法可在Lua中访问,如下所示: Foobar:method1() Foobar:method2() ... 等等 我希望能够向Foobar表“object”添加新方法(newmethod1和newmethod2) 我有以下问题: LI>是否可以以上面描述的方式扩展导出的C++对象的

我的理解是,每个类都是在lua端“实现”的,作为一个lua表。我想知道,是否可以将新的(LUA)方法添加到C++对象表中,这样我就可以实现向C++类添加新方法的效果。 假设我正在导出类Foobar

Foobar的方法可在Lua中访问,如下所示:

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

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

我有以下问题:

<> LI>是否可以以上面描述的方式扩展导出的C++对象的功能?
  • 如何向Foobar表添加新函数?(我对Lua比较陌生)

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

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

    Foobar["extra_method"] = function (self, arg1, arg2) print(arg1, arg2) end
    
    现在你可以做:

    Foobar:extra_method(1,2)
    
    将显示
    12

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

    编辑:处理评论

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

    class Foobar {
      public:
        void method1();
        static void method2();
    };
    
    当tolua++为这个类生成lua绑定代码时,它将为您提供一个包含以下方法的表

    • new()-调用as
      Foobar:new()
      ,以创建Foobar的实例
    • delete()-调用as
      instance:delete()
      ,以销毁Foobar的实例
    • method1()-调用as
      实例:method1()
      在实例上运行method1
    • method2()-调用as
      Foobar:method2()
      运行method2
    然而,tolua++实际上并没有使用两个不同的表(一个用于应该附加到类本身的方法,另一个用于该类实例的方法)。相反,它将两者合并在一起,因此可以运行
    Foobar:method1()
    instance:new()。。。尽管这些方法不应该这样使用。因此,静态方法的使用方式和实例方法的使用方式没有区别。在句法上,它也是一样的。(我个人认为这是tolua++的一个问题。)

    如果您正在寻找一个示例,下面是您应该如何从lua中调用这些函数:

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

    谢谢你的解释。有一件事仍然不清楚——静态方法的调用方式和实例的调用方式之间的区别。我猜调用一个名为FoBar的类的方法是FoBoAR:StasyTyMulk方法()和FoBoARVa:StasyStMyMulod()C++是否也可以覆盖现有的C++方法?无论如何,是否有让C++方法只读(即防止C++方法被赋值覆盖)?是的,你可以用完全相同的方式重写现有的C++方法,只使用现有方法的名称。制作一个只读表不是一件小事,也不是万无一失的。请看这里: