Встраивание Lua в C ++: доступ к C ++, созданному через Lua, обратно в C ++ (или возврат результатов обратно из Lua в C ++) - PullRequest
2 голосов
/ 01 февраля 2011

Название, вероятно, звучит немного рекурсивно - но я пытаюсь сделать это:

У меня есть классы C ++ Foo и Foobar; Я использую tolua ++ для экспорта их в Lua

В Lua:

function wanna_be_starting_something()
  foo = Foo:new()
  fb = Foobar:new()

  -- do something
  foo.setResult(42)  -- <- I want to store something back at the C++ end
end

В С ++

int main(int argc, char argv[])
{
    MyResult res;

    LuaEngine * engine = new LuaEngine();
    engine->run('wbs-something.lua');

    // I now want to be able to access the stored result, in variable res
};

Итак, мой вопрос заключается в следующем: как передать данные из объекта C ++, которым манипулирует Lua, обратно в программу C ++?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2011

Я не знаю tolua ++, но и luabind, и luabridge поддерживают то, что вам нужно:
* Вариант 1 - просто сделать код lua return whatever , и вы получите это в C ++. Для этого вам потребуется версия run () на основе шаблона, которая возвращает значение.
* вариант 2 - использовать движок lua ​​для определения функции, а затем использовать метод вызова движка с именем и параметрами функции. Существует несколько реализаций LuaEngine, которые поддерживают такой вызов:
LuaEngine * engine = new LuaEngine();<br> engine->run("function a(v) return v . 'a'; end ");<br> valua = engine->call("a", argument);

0 голосов
/ 01 февраля 2011

Чтобы понять, как обмениваться данными взад и вперед, вы должны узнать о стеке Lua, который Lua использует для взаимодействия с основной программой. Я полагаю, что tolua ++ позаботится об этом для экспортируемых вами классов / методов.

Здесь хорошее начало: http://www.lua.org/pil/24.html для Lua 5.0, но есть указания о том, как заставить его работать с 5.1 (я предполагаю, что вы используете версию Lua).

Если вы не хотите копаться во всех деталях, вы всегда можете прибегнуть к созданию специального метода C ++, который устанавливает значения в глобальном объекте. Не самый чистый путь, ИМХО, но мог бы сработать.

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