Я в настоящее время могу связать классы C++ с Lua, завернутые в модули, которые я загружаю с помощью luaL_requiref
с правильными статическими открытыми функциями, которые выполняют функции , и т.д. Прекрасно работает.Как зарегистрировать вложенный класс C++ в Lua
Но что, если я хотел связать вложенный класс?
Рассмотрим следующий C++ код:
class Foo {
public:
Foo(){}
void do_something();
class Bar {
public:
Bar(){}
void do_something_else();
};
};
и регистрационная Lua:
int foo_new(lua_State* L) {
new(lua_newuserdata(L, sizeof(foo)))foo();
luaL_setmetatable(L, "Foo");
return 1;
}
int foo_do_something(lua_State* L) {
Foo* foo = (Foo*)luaL_checkudata(L, 1, "Foo");
foo->do_something();
return 0;
}
int luaopen_foo(lua_State* L) {
const luaL_Reg functions[] = {
{"__index", foo_new},
{"do_something", foo_do_something},
{nullptr, nullptr}
};
if(luaL_newmetatable(L, "Foo")) {
luaL_setfuncs(L, functions, 0);
lua_pushvalue(L, -1);
lua_setfield(L, -2, "__index");
}
return 1;
}
...
luaL_requiref(L, "Foo", luaopen_foo, 1);
я могу получить доступ Foo::do_something()
в Lua, как, например:
foo = Foo()
foo:do_something()
теперь вопрос: Как зарегистрировать Foo::Bar
вложенный класс в Lua, так что я могу получить доступ к нему, как, например:
bar = Foo.Bar()
bar:do_something_else()
По сути, я хочу, чтобы зарегистрировать Bar
метод в Foo
Метастабильного, а не глобально. Нужно ли мне позвонить по номеру luaL_requiref
, или я могу сделать это в одном luaL_requiref
?
Спасибо!
Вы стали жертвой неспешной терминологии нескольких поколений. В то время как 'Bar' выглядит немного« sub », это вовсе не * подкласс *. Это * вложенный * класс. Мы предпочитаем технические термины «базовый класс», «производный класс» и «тип члена», которые не так-то просто понять. –