﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-牵着老婆满街逛-随笔分类-脚本引擎</title><link>http://www.cppblog.com/tx7do/category/2494.html</link><description>危机感是一种强大前进的动力！&lt;/br&gt;
GMail/GTalk: yanglinbo#google.com;&lt;/br&gt;
MSN/Email: tx7do#yahoo.com.cn;&lt;/br&gt;
QQ: 3 0 3 3 9 6 9 2 0 .</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 14:05:59 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 14:05:59 GMT</pubDate><ttl>60</ttl><item><title>LuaState (a Lua Wrapper) 4.1 Alpha Distribution</title><link>http://www.cppblog.com/tx7do/archive/2006/08/20/11492.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 20 Aug 2006 05:26:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/20/11492.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11492.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/20/11492.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11492.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11492.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: LuaState (a Lua Wrapper) 4.1 Alpha Distribution						http://workspacewhiz.com/Other/LuaState/LuaState.html								http://workspacewhiz.com/Other/LuaState/LuaState_LuaWrapper41Alpha.zip				...&nbsp;&nbsp;<a href='http://www.cppblog.com/tx7do/archive/2006/08/20/11492.html'>阅读全文</a><img src ="http://www.cppblog.com/tx7do/aggbug/11492.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-20 13:26 <a href="http://www.cppblog.com/tx7do/archive/2006/08/20/11492.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>通过例子学习Lua_1(转)</title><link>http://www.cppblog.com/tx7do/archive/2006/08/20/11490.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 20 Aug 2006 04:58:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/20/11490.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11490.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/20/11490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11490.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11490.html</trackback:ping><description><![CDATA[
		<span class="tpc_content">本文作者是OGDEV的HACK达人<br /><br /><br />通过例子学习Lua(1) ---- Hello World<br /><br />1.前言<br /><br />偶最近在学习Lua, 所以写出心得和大家共享, 争取一天写一篇, 嘿嘿.<br />才开始学所以内容很浅, 希望大家包涵.<br /><br />Lua是一种完全免费的脚本语言, 可以和C/C++语言紧密结合,<br />它的官方网站在<a href="http://www.lua.org./" target="_blank">http://www.lua.org./</a> 在网站上可以下载到lua的源码, 没有可<br />执行版本, 不过不用担心, 因为lua源码可以在任何一种C/C++的编译器上编译.<br /><br />如果要学习Lua, 官方网站上的Reference是必备的，上面有每个命令的用法，非常详细。<br />参考手册 <a href="http://www.lua.org/manual/5.0/" target="_blank">http://www.lua.org/manual/5.0/</a><br />作者写的Programming in Lua <a href="http://www.lua.org/pil/" target="_blank">http://www.lua.org/pil/</a><br /><br />2.编译<br />如果用的VC6, 可以下载所需的project文件,地址在<br /><a href="http://sourceforge.net/project/showfiles.php?group_id=32250&amp;package_id=115604" target="_blank">http://sourceforge.net/project/showfiles.php?group_id=32250&amp;package_id=115604</a><br />VSNET2003可以下载这个sln文件<a href="http://home.comcast.net/~vertigrated/lua/vs7.zip" target="_blank">http://home.comcast.net/~vertigrated/lua/vs7.zip</a><br />偶用的是cygwin和linux, 打入以下命令即可,<br />tar -zxvf lua-5.0.2.tar.gz<br />cd lua-5.0.2<br />sh ./configure<br />make<br />这样就OK了。<br />为了以后使用方便，最好把bin目录加入到path里面。<br /><br />3."Hello, world!"<br />现在开始偶们的第一个小程序"Hello, world!"<br />把以下程序打入文件e01.lua<br /><br />例1:e01.lua<br />-- Hello World in Lua <br />print("Hello World.")<br /><br />Lua有两种执行方式，一种是嵌入到C程序中执行，还有一种是直接从命令行方式下执行。<br />这里为了调试方便，采用第二种方式，执行命令 lua e01.lua<br /><br />输出结果应该是：<br />Hello World.<br /><br />4.程序说明<br />第一行 -- Hello World in Lua<br />这句是注释，其中--和C++中的//意思是一样的<br />第二行 print("Hello World.")<br />调用lua内部命令print，输出"Hello World."字符串到屏幕，Lua中的字符串全部是由"括起来的。<br />这个命令是一个函数的调用，print是lua的一个函数，而"Hello World."是print的参数。<br /><br />5.试试看<br />在Lua中有不少字符串的处理操作，本次的课后试试看的内容就是，找出连接两个字符串的操作，<br />并且print出来。</span>
		<br />
<img src ="http://www.cppblog.com/tx7do/aggbug/11490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-20 12:58 <a href="http://www.cppblog.com/tx7do/archive/2006/08/20/11490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua中调用C/C++函数 (转)</title><link>http://www.cppblog.com/tx7do/archive/2006/08/20/11489.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 20 Aug 2006 04:57:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/20/11489.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11489.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/20/11489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11489.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11489.html</trackback:ping><description><![CDATA[1.前言<br />上次偶说到从C/C++中调用Lua的函数, 然后就有朋友问从Lua中如何调用C/C++的<br />函数, 所以偶们这次就来说说这个问题. 首先偶们会在C++中建立一个函数, 然后<br />告知Lua有这个函数, 最后再执行它. 另外, 由于函数不是在Lua中定义的, 所以<br />无法确定函数的正确性, 可能在调用过程中会出错, 因此偶们还会说说Lua出错处<br />理的问题.<br /><br />2.Lua中调用C函数<br />在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种<br />类型:<br />typedef int (*lua_CFunction) (lua_State *L);<br /><br />也就是说, 偶们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能<br />被Lua所调用. 但是不要忘记了, 偶们的lua_State是支持栈的, 所以通过栈可以<br />传递无穷个参数, 大小只受内存大小限制. 而返回的int值也只是指返回值的个数<br />真正的返回值都存储在lua_State的栈中. 偶们通常的做法是做一个wrapper, 把<br />所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了. <br /><br />下面这个例子是一个C++的average()函数, 它将展示如何用多个参数并返回多个值<br /><br />例e14.cpp<br />#include &lt;stdio.h&gt;<br /><br />extern "C" {<br />#include "lua.h"<br />#include "lualib.h"<br />#include "lauxlib.h"<br />}<br /><br />/* the Lua interpreter */<br />lua_State* L;<br /><br />static int average(lua_State *L)<br />{<br />/* get number of arguments */<br />int n = lua_gettop(L);<br />double sum = 0;<br />int i;<br /><br />/* loop through each argument */<br />for (i = 1; i &lt;= n; i++)<br />{<br />/* total the arguments */<br />sum += lua_tonumber(L, i);<br />}<br /><br />/* push the average */<br />lua_pushnumber(L, sum / n);<br /><br />/* push the sum */<br />lua_pushnumber(L, sum);<br /><br />/* return the number of results */<br />return 2;<br />}<br /><br />int main ( int argc, char *argv[] )<br />{<br />/* initialize Lua */<br />L = lua_open();<br /><br />/* load Lua base libraries */<br />lua_baselibopen(L);<br /><br />/* register our function */<br />lua_register(L, "average", average);<br /><br />/* run the script */<br />lua_dofile(L, "e15.lua");<br /><br />/* cleanup Lua */<br />lua_close(L);<br /><br />return 0;<br />}<br /><br />例e15.lua<br />-- call a C++ function<br /><br />avg, sum = average(10, 20, 30, 40, 50)<br /><br />print("The average is ", avg)<br />print("The sum is ", sum)<br /><br /><br />程序说明:<br />* lua_gettop()的作用是返回栈顶元素的序号. 由于Lua的栈是从1开始编号的,<br />所以栈顶元素的序号也相当于栈中的元素个数. 在这里, 栈中元素的个数就<br />是传入的参数个数.<br />* for循环计算所有传入参数的总和. 这里用到了数值转换lua_tonumber().<br />* 然后偶们用lua_pushnumber()把平均值和总和push到栈中.<br />* 最后, 偶们返回2, 表示有两个返回值.<br />* 偶们虽然在C++中定义了average()函数, 但偶们的Lua程序并不知道, 所以需<br />要在main函数中加入<br /><br />  /* register our function */<br />lua_register(L, "average", average);<br /><br />这两行的作用就是告诉e15.lua有average()这样一个函数.<br />* 这个程序可以存成cpp也可以存成c, 如果以.c为扩展名就不需要加extern "C"<br /><br />编译的方法偶们上次说过了, 方法相同.<br />e15.lua执行的方法只能用上例中的C++中执行, 而不能用命令行方式执行.<br /><br />3.错误处理<br />在上例中, 偶们没有对传入的参数是否为数字进行检测, 这样做不好. 所以这里偶<br />们再加上错误处理的片断.<br /><br />把这段加在for循环之内:<br />if (!lua_isnumber(L, i)) {<br />lua_pushstring(L, "Incorrect argument to 'average'");<br />lua_error(L);<br />}<br />这段的作用就是检测传入的是否为数字.<br /><br />加上这段之后, 偶们debug的时候就会简单许多. 对于结合两种语言的编程, 它们之<br />间传递数据的正确性检测是非常重要的. <br /><br />这里有别人写好的例子:<br />VC的 <a href="http://tonyandpaige.com/tutorials/luaavg.zip" target="_blank">http://tonyandpaige.com/tutorials/luaavg.zip</a><br />Linux的 <a href="http://tonyandpaige.com/tutorials/luaavg.tar.gz" target="_blank">http://tonyandpaige.com/tutorials/luaavg.tar.gz</a><br /><br />至此, Lua与C的结合就基本讲完了, 下次偶要开始说说Lua与面向对象.<br />但是偶自己还没有学完, 所以大家可能要多等两天了. Sorry!<br /><img src ="http://www.cppblog.com/tx7do/aggbug/11489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-20 12:57 <a href="http://www.cppblog.com/tx7do/archive/2006/08/20/11489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Lua 脚本 C++ 封装库 LuaWrapper</title><link>http://www.cppblog.com/tx7do/archive/2006/08/20/11488.html</link><dc:creator>杨粼波</dc:creator><author>杨粼波</author><pubDate>Sun, 20 Aug 2006 04:52:00 GMT</pubDate><guid>http://www.cppblog.com/tx7do/archive/2006/08/20/11488.html</guid><wfw:comment>http://www.cppblog.com/tx7do/comments/11488.html</wfw:comment><comments>http://www.cppblog.com/tx7do/archive/2006/08/20/11488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/tx7do/comments/commentRss/11488.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/tx7do/services/trackbacks/11488.html</trackback:ping><description><![CDATA[
		<p>转载： <a href="http://www.d2-life.com/LBS/blogview.asp?logID=41">http://www.d2-life.com/LBS/blogview.asp?logID=41</a></p>
		<p>
		</p>
		<p>　　使用Lua作脚本，主要是因为它小巧玲珑（体积小，运行快），而且它的语法又比较简单明了。不过，使用LuaAPI将Lua引擎集成到程序中，确实有一些不方便——用落木随风网友的话来说，就是"就象用汇编"。当然，现在你不用再这么辛苦了，因为你可以使用LuaWrapper For C++。使用这个工具，在C++中集成Lua脚本就是轻而易举的事。你原有的C++函数和类，几乎不需要任何改变，就可以与Lua脚本共享。<br /></p>
		<p>作者： 沐枫 （第二人生成员）<br />版权所有转载请注明原出处<br />主页：第二人生 <a href="http://www.d2-life.com/" target="_blank" rel="nofollow">http://www.d2-life.com</a><br />　　　<a href="http://www.d2-life.com/LBS/blogview.asp?logID=41" target="_blank" rel="nofollow">http://www.d2-life.com/LBS/blogview.asp?logID=41</a><br /><br />为什么要用Lua作脚本？<br />　　使用Lua作脚本，主要是因为它小巧玲珑（体积小，运行快），而且它的语法又比较简单明了。不过，使用LuaAPI将Lua引擎集成到程序中，确实有一些不方便——用落木随风网友的话来说，就是"就象用汇编"。当然，现在你不用再这么辛苦了，因为你可以使用LuaWrapper For C++。使用这个工具，在C++中集成Lua脚本就是轻而易举的事。你原有的C++函数和类，几乎不需要任何改变，就可以与Lua脚本共享。<br />　　我们接下来，用实例来说明，如何用LuaWrapper来集成Lua脚本到你的程序中去。<br /><br />1.  创建Lua引擎<br />　　LuaWrap lua; 或者 LuaWrap* lua = new LuaWrap;<br />　　创建一个LuaWrap对象，就是创建一个Lua脚本引擎。并且根据Lua的特性，你可以创建任意多个Lua引擎，甚至可以分布在不同的线程当中。<br /><br />2.  装载并执行脚本程序<br />　　你可以从缓冲区中装载Lua脚本：<br />　　lua.LoadString(<br />　　　　"print('Hello World')"<br />　　);<br />　　当然，你也可以从文件中装入，并执行Lua脚本：<br />　　Lua.LoadFile("./test.lua");<br />　　Lua的脚本，可以是源代码，也可以经过编译后的中间代码。也许你对编译后的中间代码更感兴趣——如果你不希望让源代码赤裸裸的袒露在大家的眼前。<br /><br />3.  获取和设置Lua变量<br />　　能够获取和设置脚本变量的内容，是一个最基本的功能。你可以使用GetGlobal和SetGlobal函数来做到这一点：<br />　　(1)  获取变量：<br />　　　　int a = lua.GetGlobal&lt;int&gt;("a");<br />　　　　LuaTable table = lua.GetGlobal&lt;LuaTable&gt;("t");<br />　　　　这里，&lt;&gt; 里头的类型，就是想要的变量的类型。<br />　　(2)  设置变量：<br />　　　　lua.SetGlobal("a", a); <br />　　　　lua.SetGlobal("t", table);<br /><br />4.  调用Lua函数<br />　　使用Call函数，就可以很简单的从你的程序中调用Lua函数：<br />　　lua.Call&lt;void&gt;("print", "Hello World");<br />　　int sum = lua.Call&lt;int&gt;("add", 2, 3);<br />　　这里，&lt;&gt; 里头的类型是返回值的类型。<br /><br />5.  如何让Lua也能调用C++的函数<br />　　精采的地方来了。假如有下面这样的一个函数：<br />　　int add(int a, int b)<br />　　{<br />　　　　return a + b;<br />　　}<br />　　如果想让它能够让Lua使用，只需将它注册到Lua引擎当中就可以了：<br />　　lua.RegisterFunc("add", int(int,int), add);<br />　　这样，Lua中就可以用直接使用了：<br />　　（Lua脚本）sum = add(1, 3) <br /><br />　　(*) RegisterFunc的功能，就是让你把C++的函数注册到Lua中，供Lua脚本使用。<br />　　　　第一个参数，是想要在Lua中用的函数名。<br />　　　　第二个参数，是C++中函数的原型； C++允许函数重载的，你可以使用函数原型，来选择需要注册到Lua引擎中的那个函数。<br />　　　　第三个参数，就是C++中函数的指针了。<br /><br />6.  如何能让C++的类在Lua中使用<br />　　我们先看看下面这个C++类：<br />class MyArray<br />{<br />  std::vector&lt;double&gt; array;<br />public:<br />  void setvalue(int index, double value);<br />  double getvalue(int index);<br />  int size();<br />  const char* ToString();<br />};<br /><br />　　你准备要让Lua能够自由访问并操作这个类。很简单，你只需增加几个宏定义就可以了：<br /><br />class MyArray<br />{<br />  std::vector&lt;double&gt; array;<br />public:<br />  void setvalue(int index, double value);<br />  double getvalue(int index);<br />  int size();<br />  const char* ToString();<br />  // 将一个 class 作为一个 Lua 对象是很容易的，只需要增加以下宏定义。<br />  DEFINE_TYPENAME("My.array");<br />  BEGIN_REGLUALIB("array")<br />      LUALIB_ITEM_CREATE("new", MyArray )  // 创建MyArray <br />      LUALIB_ITEM_DESTROY("del", MyArray )  // 消除MyArray。<br />  END_REGLUALIB()<br />  BEGIN_REGLUALIB_MEMBER()<br />    LUALIB_ITEM_FUNC("size", int (MyArray*), &amp;MyArray::size)<br />    LUALIB_ITEM_FUNC("__getindex", double(MyArray*, int), &amp;MyArray::getvalue)  <br />    LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &amp;MyArray::setvalue)<br />    LUALIB_ITEM_FUNC("__tostring", const char* (MyArray*), &amp;MyArray::ToString)<br />    LUALIB_ITEM_DESTROY("__gc", MyArray )   // 垃圾收集时消除对象用。<br />  END_REGLUALIB_MEMBER()<br />};<br /><br />　　只要有了这些宏定义，这个类就是可以在Lua中使用的类了，我们就可以在Lua中注册这个类了：<br />　　lua.Register&lt;MyArray&gt;()<br /><br />　　这样注册以后，我们在Lua中就可以使用这个类了：<br />　　a = array.new()  -- 创建对象，相当于 a = new Myarray<br />　　a[1] = 10  -- 调用__newindex，也就是C++中的 a-&gt;setvalue(1, 10)<br />　　a[2] = 20  -- 调用__newindex，也就是C++中的 a-&gt;setvalue(2, 20)<br />　　print(<br />　　　　a,  -- 调用 __tostring，也就是C++中的 a-&gt;ToString()<br />　　　　a:size(), -- 相当于C++中的 a-&gt;size()<br />　　　　a[1], -- 调用__getindex，也就是C++中的a-&gt;getvalue(1)<br />　　　　a[2]) --调用__getindex，也就是C++中的a-&gt;getvalue(2)<br />　　array.del(a)  -- 清除对象，相当于 delete a<br />　　a = nil  -- 清空 a，很象C++中的 a = NULL<br /><br />　　当然，你也可以不用del这个对象，而是等待Lua帮你自动进行垃圾回收。在Lua进行垃圾回收时，它会自动调用这个对象的 __gc ，相当于 delete。<br /><br />　　那么，在C++中要创建MyArray对象，并且传递给Lua全局变量怎么办？就象前面讲过的一样，使用SetGlobal：<br />　　MyArray* a = new MyArray; <br />　　lua.SetGlobal("a", a);<br />　　要获取该对象，同样的，应该使用GetGlobal：<br />　　MyArray* a = lua.GetGlobal&lt;MyArray&gt;("a");<br />　　<br />　　对于传递给Lua的对象，就让Lua来管理该对象的生存周期好了。如果你非要删除它的话，你可以使用DelGlobalObject：<br />　　lua.DelGlobalObject&lt;MyArray&gt;("a");<br />　　不过这么做的话，你应当明白你在做什么，因为在Lua的脚本中，可能已经在多处引用了这个对象了。删除了其中一个，将导致其它引用对象失效，从而可能引致系统崩溃。<br /><br />　　(1)  DEFINE_TYPENAME("My.array");<br />　　　　定义类型的名称。在Lua中，这个类型名称是唯一用来识别C++类型的，你必须为不同的对象给予不同的名称。<br /><br />　　(2)  BEGIN_REGLUALIB("array") ... END_REGLUALIB()<br />　　　　你可以为一个对象定义一个程序库，"array"就是程序库的名字。在程序库中定义的函数是全局函数，在Lua中，使用该函数，需要在函数前加上库的名字，如：array.new（）。通常，程序库会包含创建对象的方法。如：<br />　　　　LUALIB_ITEM_CREATE("new", MyArray )  // 创建MyArray </p>
		<p>　　　　这样子，你才能在Lua中创建MyArray：<br />　　　　a = array.new()<br />　　<br />　　　　你也可以选择增加一个删除对象操作：<br />　　　　LUALIB_ITEM_DESTROY("del", MyArray )   // 删除MyArray<br />　　　　这样，你就可以直接删除一个对象了：<br />　　　　array.del(a)<br /><br />　　(3)  BEGIN_REGLUALIB_MEMBER() ...END_REGLUALIB_MEMBER()<br />　　　　在此处，你可以定义对象的成员函数，也可以重载对象的操作符——是的，就象C++的operator重载。例如：<br />　　　　LUALIB_ITEM_FUNC("__newindex", void (MyArray*, int, double), &amp;MyArray::setvalue)<br />　　　　就是重载 operator[] 操作符。Lua中可重载的操作符还有许多，如：<br /><br />　　　　__getindex：操作符[]，支持读取访问，如 v = a[10]<br />　　　　__newindex：操作符[]，支持赋值访问，如 a[10] = 1.22<br />　　　　__tostring：将变量转换成字串__add：等同于operator +<br />　　　　__add：操作符 ＋<br />　　　　__sub：操作符 -<br />　　　　__mul：操作符 ×<br />　　　　__div：操作符 ÷<br />　　　　__pow：操作符 ^ (乘方)<br />　　　　__unm：一元操作符 -<br />　　　　__concat：操作符 .. (字符串连接)<br />　　　　__eq：操作符 == (a ~= b等价于 not a == b)<br />　　　　__lt：操作符 &lt; (a &gt; b 等价于 b &lt; a)<br />　　　　__le：操作符 &lt;= (a &gt;= b 等价于 b &lt;= a，要注意的是，如果没有定义"__le"，则Lua将会尝试将a&lt;=b 转换成 not (b &lt; a) )<br /><br />　　　　__gc：在垃圾回收时调用此函数，相当于C++的析构函数。强烈建议定义此操作符，以免造成内存泄漏等情况。比如：<br />　　　　LUALIB_ITEM_DESTROY("__gc", MyArray )   // 垃圾收集时消除对象用。<br /><br />　　　　(注) 这里要说明一下，在lua中，访问索引操作符是__index，不是__getindex，在luaWrapper库中，为了方便使用，将其映射为__getindex，同时，对__index的定义将会被忽略。<br /><br />　　　　就这么简单。假如你已经有现成的类，而你没有修改该类的权力，如何将其加入到Lua中呢？答案就是，继承它，将把派生类加入到Lua中。<br /><br />结束语<br />　　LuaWrapper 需要用到boost库的支持：boost/type_traits.hpp, boost/function.hpp, boost/bind.hpp，它使用了C++的模板部份特化，因此，C++编译器如果不支持此特性，将无法编译。目前支持此特性的编译器已经有很多。在VisualStudo产品系列中，只有VC7.1能支持此特性，因此，您如果正在使用VisualStudio，请确认你用的是VisualStudio2003。<br />　　如果你觉得 LuaWrapper For C++ 能够帮助你，我会感觉很荣幸。我很愿意将这个程序库分享给大家。顺便一提的是，如果你在使用过程中发现BUG，或是有好的建议，希望您能与我联系。你在使用过程中，请不要删除文件中的署名信息；如果你修改了程序库，请您在修改的文件中加入您的修改说明。当然，我会非常欢迎您能将修改后的程序回馈给我。我会继续优化并完善它。<br /></p>
<img src ="http://www.cppblog.com/tx7do/aggbug/11488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/tx7do/" target="_blank">杨粼波</a> 2006-08-20 12:52 <a href="http://www.cppblog.com/tx7do/archive/2006/08/20/11488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>