【问题标题】:Create new instance of certain user type创建特定用户类型的新实例
【发布时间】:2014-07-02 11:54:57
【问题描述】:

我正在使用 tolua++ 自动向 Lua 公开 C++ 类型。似乎当我暴露某种类型时,例如

struct TestComponent
{
   float foo;
   string bar;
}

tolua 的作用(至少在我看来是这样的)是向 lua 环境添加一个新的元表(在这种情况下,它会被称为 TestComponent)使用一些常规元方法,例如 __add__lt,以及 __index__newindex 等。它还具有一些自定义函数(称为 .set.get),当您获取或设置结构/类的某些成员时似乎使用这些函数.这里TestComponent的类型好像只是“table”。

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

a = TestComponent:new()

那么,问题是,如何创建这种类型的新实例并将其分配给变量?例如,将其交给需要 TestComponent 类型参数的函数。

【问题讨论】:

    标签: lua tolua++ meta-method


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-24
      相关资源
      最近更新 更多