Создать новый экземпляр определенного типа пользователя

Я использую tolua++ для автоматического предоставления типов C++ Lua. Кажется, что когда я выставляю какой-то тип, например

struct TestComponent
{
   float foo;
   string bar;
}

Что толуа делает (по крайней мере, так мне кажется), так это добавляет новую метатабельность в среду lua (в этом случае ее просто называют TestComponent) с некоторыми обычными метаметодами, такими как __add, __lt, так же как __index, __newindexи т.д. Он также имеет некоторые пользовательские функции (называемые .set а также .get) которые, кажется, используются, когда вы получаете или устанавливаете определенные члены структуры / класса. Тип TestComponent здесь, кажется, просто "таблица".

Однако для простых определений структуры, подобных описанным выше, не хватает функций / методов для создания нового экземпляра типа. TestComponentнапример,

a = TestComponent:new()

Тогда возникает вопрос: как мне создать новый экземпляр этого типа и присвоить его переменной? Например, передать его функции, которая ожидает аргумент типа TestComponent,

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
Другие вопросы по тегам