创建特定用户类型的新实例

时间:2014-07-02 11:54:58

标签: lua tolua++ meta-method

我使用tolua ++自动将C ++类型暴露给Lua。似乎当我暴露某种类型时,例如

struct TestComponent
{
   float foo;
   string bar;
}

tolua做了什么(至少这对我来说是这样)是为lua环境添加一个新的元表(在这种情况下它只是被称为TestComponent),带有一些常规元方法,例如{{ 1}},__add,以及__lt__index等。它还有一些自定义函数(称为__newindex.set)当你获得或设置struct / class的某些成员时使用。 TestComponent的类型似乎只是" table"。

然而,对于像上面这样简单的结构定义,似乎缺少的是创建类型.get的新实例的函数/方法,例如

TestComponent

那么,问题是,如何创建此类型的新实例并将其分配给变量?例如,将其交给期望类型为a = TestComponent:new() 的参数的函数。

1 个答案:

答案 0 :(得分:0)

自从我使用tolua ++以来已经过了几年,但根据文档看来,如果您的结构有一个构造函数,那么您可以使用a = TestComponent()a = TestComponent:new()创建对象(两者都应该有效,除非你有旧版本的tolua ++)。在没有C ++结构中的构造函数的情况下,文档不会说,但根据您的陈述,似乎TestComponent成为具有给定字段和关联值的常规表对象,在这种情况下,有一个构造函数没有意义(表是对象,你不能创建它的多个实例)。

因此,如果您可以编辑结构的C ++标头以向其添加构造函数,那么它可能会起作用。如果你不能这样做,那么你可以自己定义一个构造函数(注意:未经测试):

function TestComponent:new()
    local obj = {}
    for k,v in pairs(self) do 
        obj[k] = v
    setmetatable(obj, self)
    return obj
end

您可能必须过滤键,以便只获取值(例如,不是函数),或者使用显式赋值替换循环,例如:

function TestComponent:new()
    local obj = {}
    obj.foo = self.foo
    obj.bar = self.bar
    setmetatable(obj, self)
    return obj
end