我使用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()
的参数的函数。
答案 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