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

我正在使用tolua++自动将C++类型暴露给Lua. 当我暴露一些类型时,tolua++似乎会添加一个新的metatable到Lua环境中(在这种情况下,它将被称为TestComponent)并添加一些常规的metamethods,例如 __add__lt,以及 __index__newindex等。它还具有一些自定义函数(名为.set.get),当获取或设置结构/类的某些成员时似乎会调用它们。在这里,TestComponent的类型似乎只是"table"。

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

a = TestComponent:new()

那么问题是,我该如何创建这种类型的新实例并将其赋给变量?例如,将它传递给期望一个TestComponent类型的参数的函数。

点赞
用户869951
用户869951

几年前我使用过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
2014-07-04 02:15:55