C++ 在C+中嵌入Lua+;:访问C++;通过Lua创建,回到C++;(或将结果从Lua返回到C+;+;)
标题听起来可能有点递归——但这就是我要做的: <我有C++类FoO和FooBar; 我正在使用tolua++将它们导出到Lua 在卢阿:C++ 在C+中嵌入Lua+;:访问C++;通过Lua创建,回到C++;(或将结果从Lua返回到C+;+;),c++,lua,C++,Lua,标题听起来可能有点递归——但这就是我要做的: >我的问题是:如何将Lua操作的C++对象的数据传递回C++程序? ,了解如何来回交换数据,您应该了解Lua栈是Lua用来与主机程序通信的结构。我想tolua++会为您导出的类/方法解决这个问题 这里有一个很好的开端:适用于Lua5.0,但是有一些关于如何使其与5.1一起工作的指示(我假设您使用的是Lua版本) 如果你不想深入了解所有的细节,你可以总是选择创建一个特设的C++方法来将值设置成全局对象。IMHO,这不是最干净的方法,但可以工作。要了解
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
<> P> >我的问题是:如何将Lua操作的C++对象的数据传递回C++程序? ,了解如何来回交换数据,您应该了解Lua栈是Lua用来与主机程序通信的结构。我想tolua++会为您导出的类/方法解决这个问题 这里有一个很好的开端:适用于Lua5.0,但是有一些关于如何使其与5.1一起工作的指示(我假设您使用的是Lua版本)
<>如果你不想深入了解所有的细节,你可以总是选择创建一个特设的C++方法来将值设置成全局对象。IMHO,这不是最干净的方法,但可以工作。要了解如何来回交换数据,您应该了解Lua用于与宿主程序通信的结构Lua堆栈。我想tolua++会为您导出的类/方法解决这个问题 这里有一个很好的开端:适用于Lua5.0,但是有一些关于如何使其与5.1一起工作的指示(我假设您使用的是Lua版本)
<>如果你不想深入了解所有的细节,你可以总是选择创建一个特设的C++方法来将值设置成全局对象。这不是最干净的方式,但是可以工作。我不知道tolua++,但是luabind和luabridge都支持您需要的:
*选项1只是让Lua代码执行<代码>返回任何,然后您将得到C++中的代码。这要求您有一个基于模板的run()版本,它返回一个值。
*选项2是使用lua引擎定义函数,然后使用引擎的call方法和函数名和参数。有几种LuaEngine实现支持这样的调用:
LuaEngine*引擎=新LuaEngine()
引擎->运行(“函数a(v)返回v'a';结束”)
valua=引擎->调用(“a”,参数);
我不知道tolua++,但luabind和luabridge都支持您需要的:*选项1只是让Lua代码执行<代码>返回任何,然后您将得到C++中的代码。这要求您有一个基于模板的run()版本,它返回一个值。
*选项2是使用lua引擎定义函数,然后使用引擎的call方法和函数名和参数。有几种LuaEngine实现支持这样的调用:
LuaEngine*引擎=新LuaEngine()
引擎->运行(“函数a(v)返回v'a';结束”)
valua=引擎->调用(“a”,参数);
由于时间限制,我将进行战术解决方案(即现在)——即将值存储在全局对象中,这可以在C++中访问。你能不能发布(或指向)一个片段,展示我如何做这个?你能解释一下什么是ad-hoc C++方法吗?我的理解是:一个C++方法/自由函数,可以被被暴露对象调用,将数据转储到C++中的静态变量中。这就是你的意思吗?@oompa,是的,一个全局对象就可以了。我正在考虑传回一个指向其方法调用Lua脚本的对象的指针。当然可以用一个Lua UsRead来做,可能会查看ToLua++生成的代码,你可以知道如何做。由于时间限制,我会去执行战术解决方案(现在)——即在一个全局对象中存储值,这些对象可以在C++中访问。你能不能发布(或指向)一个片段,展示我如何做这个?你能解释一下什么是ad-hoc C++方法吗?我的理解是:一个C++方法/自由函数,可以被被暴露对象调用,将数据转储到C++中的静态变量中。这就是你的意思吗?@oompa,是的,一个全局对象就可以了。我正在考虑传回一个指向其方法调用Lua脚本的对象的指针。当然可以用一个Lua UsReDATA来做,可能会查看TROUA+++生成的代码,你可以知道如何去做。虽然这可能是有效的,但是你会在每次执行那个语句时都会受到编译Lua代码的惩罚。正确的方法是加载(并编译)Lua代码一次,然后执行编译后的代码。Lua执行非常快,但是每次编译Lua代码都会不必要地降低程序的速度。我同意!谢谢你的评论,虽然这可能是有用的,但是你会在每次执行那个语句时都会受到编译Lua代码的惩罚。正确的方法是加载(并编译)Lua代码一次,然后执行编译后的代码。Lua执行非常快,但是每次编译Lua代码都会不必要地降低程序的速度。我同意!谢谢你的评论
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
};