Один из вариантов - использовать light userdata, который позволяет размещать объект в куче C ++. См. Документацию для lua_pushlightuserdata
. К сожалению, легкие пользовательские данные не имеют метатабельных. Даже если вы хотите получить доступ к нему, используя Lua functions , чтобы получить / установить, вам все равно придется сделать что-то вроде этого:
static int myget(lua_State *L) {
myclass thing = lua_touserdata(L, 1);
lua_pushnumber(thing::getsize());
return 1;
}
К сожалению, поскольку это легкие пользовательские данные, нет никакого реального способа сделать эту операцию безопасной для типов - все легкие пользовательские данные обрабатываются одинаково, и у них нет метатируемых.
Лучшее решение состоит в том, чтобы выделить полные пользовательские данные в куче Lua, с надлежащей метатаблицей, содержимое которой представляет собой один указатель на объект, размещенный в куче C ++. Затем вы можете следить за моделью в Программирование в Lua . В качестве примеров вы можете взглянуть на библиотеку Lua io
, чтобы увидеть, как обрабатывается FILE *
. Таким образом, вы можете написать свои интерфейсы C, используя функцию luaL_checkudata
, и они будут в безопасности, но вы все равно будете иметь право размещать свои объекты в куче C ++ вместо в куче Lua.