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



我使用tolu++来自动将c++类型暴露给Lua。似乎当我暴露某些类型时,例如

struct TestComponent
{
   float foo;
   string bar;
}

tolua所做的(至少这对我来说是什么)是添加一个新的元表到lua环境(在这种情况下,它只是被称为TestComponent)与一些常规的元方法,如__add, __lt,以及__index, __newindex,等。它还有一些自定义函数(称为.set.get),当您获取或设置结构/类的某些成员时,似乎会使用这些函数。这里TestComponent的类型似乎只是"table"。

然而,对于上面这样的简单结构定义,它似乎缺少的是创建TestComponent类型的新实例的函数/方法,例如
a = TestComponent:new()
那么,问题是,如何创建这种类型的新实例并将其赋值给变量?例如,将其传递给需要TestComponent类型参数的函数。

我使用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

最新更新