Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中嵌入Lua+;:访问C++;通过Lua创建,回到C++;(或将结果从Lua返回到C+;+;)_C++_Lua - Fatal编程技术网

C++ 在C+中嵌入Lua+;:访问C++;通过Lua创建,回到C++;(或将结果从Lua返回到C+;+;)

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,这不是最干净的方法,但可以工作。要了解

标题听起来可能有点递归——但这就是我要做的:

<我有C++类FoO和FooBar; 我正在使用tolua++将它们导出到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

<> 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
};