Создать новый экземпляр определенного типа пользователя
Я использую 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