?
LuaPlus是Lua的C++增强,也就是说,LuaPlus本身就是在Lua的源码上进行增强得来的。用它与C++进行合作,是比较好的一个选择。
LuaPlus目前版本为:LuaPlus for Lua 5.01 Distribution Build 1080 (February 28,2004)。大家可以到
http://luaplus.org/ 站点下载:
源码?? (
http://wwhiz.com/LuaPlus/LuaPlus50_Build1081.zip)
目标码 (
http://wwhiz.com/LuaPlus/LuaPlus50_Build1081_Win32Binaries.zip)
介绍LuaPlus: 好用的Lua For C++扩展?????
沐枫网志
我将在下面说明,如何使用LuaPlus,以及如何更方便的让LuaPlus与C++的类合作无间。
1. 调用Lua脚本
?
 ????
//
?创建Lua解释器:

????LuaStateOwner?state;?
 ????
 ????
?执行Lua脚本:
????state
->
DoString(
"
print('Hello?World/n')
);
 ????
?载入Lua脚本文件并执行:
DoFile(
C:/test.lua
?载入编译后的Lua脚本文件并执行:
C:/test.luac
);


2. 与Lua脚本互相调用
?为Lua脚本设置变量
GetGlobals().SetNumber(
myvalue
,?
123456
?获得Lua变量的值
int
?myvalue?
=
?state
GetGlobal(
).GetInteger();
 ????
 ????
?调用Lua函数
????LuaFunction
<
>
?luaPrint?
print
);
 ????luaPrint(
Hello?World/n
);
 ????
 ????
?让Lua调用C语言函数


?add(
?a,0)">?b)

{?return?a+b;}
 ????state
GetGlobals().RegisterDirect(
add
????state
print(add(3,4))
?让Lua调用C++类成员函数


class
?Test

{public:?int?add(?b) b;}}
;
 ????Test?test;
 ????state
);

??? 3. 在Lua脚本中使用C++类 ??? ??? 这个稍微有点小麻烦。不过,我包装了一个LuaPlusHelper.h的文件,它可以很轻松的完成这个工作。它的实现也很简单,大家可以从源码上来获得如何用纯LuaPlus实现同样的功能。 ??? 不过,这里仍然有一个限制没有解决:不能使用虚成员函数。不过考虑到我们仅是在Lua调用一下C++函数,并不是要将C++完美的导入到Lua,这个限制完全可以接受。 ??? 另外,类成员变量不能直接在Lua中访问,可以通过类成员函数来访问(比如SetValue/GetValue之类)。?
?下面是一个简单的C++类:????
?
?Logger

 ?

{
 ?:
 ??void?LOGMEMBER(const?char*?message)

 ?? {
 ???printf("In?member?function:?%s/n ??}
 ?
 ??Logger()

 ?? Constructing(%p) /nthis);
 ???v?=10;
 ??}
 ??virtual~Logger()

 ?? Destructing(%p) /n);
 ??}
 ?
 ??Logger(?n)

 ?? ?--?Constructing[%d](%p) /n
 ??Logger(Logger?logger)

 ?? ?--?Constructing[%p](%p) /n);
 ???logger->LOGMEMBER(?Call?From?Constructor/n?SetValue(?val)

 ?? {
 ???v??val;
 ??}?GetValue()

 ?? {
 ????v;
 ??}
 ??v;
 ?}
;

?
?导入到Lua脚本:
????LuaClass
Logger
(state)
 ???????.create(
)?
?定义构造函数?Logger::Logger()
???????.create
(
Logger2
)??
?定义构造函数?Logger::Logger(int)
*>
Logger3
?定义构造函数?Logger::Logger(Logger*)
 ??????
?.destroy(
Free
?定义析构函数?Logger::~Logger()
???????.destroy(
__gc
???????.def(
lm
&
Logger::LOGMEMBER)??
?定义成员函数?Logger::LOGMEMBER(const?char*)
SetValue
Logger::SetValue)
 ???????.def(
GetValue
Logger::GetValue);

?
?在Lua中使用Logger类(1):
DoString(
 ????????
l?=?Logger();
??
?调用构造函数?Logger::Logger()
????????
l:lm('Hello?World?1');
?调用成员函数?Logger::LOGMEMBER(const?char*)
l:Free();
?调用析构函数?Logger::~Logger()
????????);

?
?在Lua中使用Logger类(2):
m?=?Logger(10);
?调用构造函数?Logger::Logger(int)
m:lm('Hello?World?2');
n?=?Logger(m);
?调用构造函数?Logger::Logger(Logger*)
n:lm('Hello?World?3');
m:SetValue(11);
 ????????
print(m.GetValue());
m,n?=?nil,?nil;
?m,n?将由Lua的垃极回收来调用析构函数
????????);


4. 将一组C函数归类到Lua模块
?
同上面一样,我采用LuaPlusHelper.h来简化:
????LuaModule(state,0)">mymodule
)
 ???????.def(
???????.def(
add2
?
 ????state
print(mymodule.add(3,4));
print(mymodule.add2(3,0)">
 ????????);


5. 使用Lua的Table数据类型
?在Lua中创建Table
????LuaObject?table?
GetGlobals().CreateTable(
mytable
);
 ????table.SetInteger(
m
10
);
 ????table.SetNumber(
f
1.99
);
 ????table.SetString(
s
Hello?World
);
 ????table.SetWString(
ch
你好
1
What
?相当于Lua中的:
 ????
?mytable?=?{m=10,?f=1.99,?s="Hello?World",?ch=L"你好",?"What"}

??
?也可以使用table作为key和value:
nexttable
)
 ????????.SetString(table,0)">Hello
)
 ????????.SetObject(
obj
????
?nexttable?=?{mytable="Hello",?obj=mytable}

?
获得Table的内容:
????LuaObject?t2?
GetGlobals(
?m?
?t2.GetByName(
).GetInteger();
 ????
 ????LuaObject?t3?
);
 ????std::
string
?str?
?t3.GetByObject(t2).GetString();

??? 6? 遍历Table
?
?LuaStateOwner?state; 
?state.DoString(?
MyTable?=?{?Hi?=?5,?Hello?=?10,?Yo?=?6?}
?);
 ?
 ?LuaObject?obj?
?state.GetGlobals()[?
MyTable
?];
 ?
for
?(?LuaTableIterator?it(?obj?);?it;?it.Next()?)

 ?

{
 ??????key??it.GetKey().GetString();
 ??????num??it.GetValue().GetInteger();
 ?}


篇尾
上面我只是简单的举一些例子来说明LuaPlus以及LuaPlusHelper的使用方法,具体文档请参见LuaPlus。
需要下载LuaPlusHelper,请点这里: http://www.cnblogs.com/Files/ly4cn/LuaPlusHelper.rar
测试程序(VC7.1): http://www.cnblogs.com/Files/ly4cn/LuaPlusTest.rar
标签:
C++??
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|