С ++ классы и Луа - PullRequest
       35

С ++ классы и Луа

2 голосов
/ 07 мая 2010

Я хочу иметь объекты C ++, которые я могу читать и записывать как на C ++, так и на Lua.

Я смотрел: http://www.lua.org/pil/28.html

Однако мне не нравится это решение,так как мои объекты имеют конструкторы и деструкторы (и они важны, так как я использую RAII, и они заботятся о счетчиках ссылок).

Что мне не нравится в решении PIL, так это то, что объект размещается в куче Lua.

Вместо этого я хочу создать свой собственный объект C ++, и у lua есть способ получить / установить его.

У кого-нибудь есть хороший учебник /ссылка на это?

Танки!

Ответы [ 4 ]

6 голосов
/ 07 мая 2010

Один из вариантов - использовать 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.

1 голос
/ 07 мая 2010

Кажется, я помню, как один из сотрудников работал над такими вещами, как объекты Lua и C ++ как граждане 1-го класса и полностью работоспособный в обоих направлениях.

Если память мне не изменяет, она основана на Lua ++ , но на данный момент я не уверен, извините.

1 голос
/ 07 мая 2010

Похоже, завод - это путь? Например. вместо того, чтобы просто динамически создавать свой объект в Lua с помощью «стандартных» средств, вы можете вызвать функцию Create and Destroy?

0 голосов
/ 07 мая 2010

Используйте размещение новых. Смотрите здесь для удобного шаблона:

template< typename T >
void my_newuserdata( lua_State * L ) {
   new ( reinterpret_cast< T * >( lua_newuserdata( L, sizeof( T ) ) ) ) T();
}

template< typename T >
int my_gc( lua_State * l ) {
   reinterpret_cast< T * >( lua_touserdata( L, 1 ) )->~T();
   return 0;
}

(Не проверено, подробности см. Выше).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...