托卢亚++;:将lua函数添加到C++;类,该类已导出到Lua 我使用TROUA++将一些C++类导出到Lua.
我的理解是,每个类都是在lua端“实现”的,作为一个lua表。我想知道,是否可以将新的(LUA)方法添加到C++对象表中,这样我就可以实现向C++类添加新方法的效果。 假设我正在导出类Foobar Foobar的方法可在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++对象的
Foobar:method1()
Foobar:method2()
...
等等
我希望能够向Foobar表“object”添加新方法(newmethod1和newmethod2)
我有以下问题:
<> LI>是否可以以上面描述的方式扩展导出的C++对象的功能?
是的,可以向现有导出类添加新方法 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的实例Foobar:new()
- delete()-调用as
,以销毁Foobar的实例instance:delete()
- method1()-调用as
在实例上运行method1实例:method1()
- method2()-调用as
运行method2Foobar:method2()
Foobar:method1()
和instance:new()。。。尽管这些方法不应该这样使用。因此,静态方法的使用方式和实例方法的使用方式没有区别。在句法上,它也是一样的。(我个人认为这是tolua++的一个问题。)
如果您正在寻找一个示例,下面是您应该如何从lua中调用这些函数:
obj = Foobar:new()
print( obj:method1() )
obj:delete()
谢谢你的解释。有一件事仍然不清楚——静态方法的调用方式和实例的调用方式之间的区别。我猜调用一个名为FoBar的类的方法是FoBoAR:StasyTyMulk方法()和FoBoARVa:StasyStMyMulod()C++是否也可以覆盖现有的C++方法?无论如何,是否有让C++方法只读(即防止C++方法被赋值覆盖)?是的,你可以用完全相同的方式重写现有的C++方法,只使用现有方法的名称。制作一个只读表不是一件小事,也不是万无一失的。请看这里: