?<将简单C++类导出到lua> ??? 利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请参考
tolua++的在线文档。 ??? 首先生成实际的c++头文件,定义我们要导出的类。tclass.h内容如下:
 #ifndef?_TESTCLASS_H 
#define
?_TESTCLASS_H

 #include?
<
string
.h
>



class
?CNumber
...
{?//tolua_export  public:  ????tolua_begin????CNumber():m_nNum(0) 
 ????...{ 
 ????}  ????CNumber(int?num):m_nNum(num) 
 ????...{  ????}  ????  ????~CNumber() 
 ????...  ????void?SetNumber(?num) 
 ????...{  ????????m_nNum?=?num;  ????}?GetNumber() 
 ????...{  ????????return?m_nNum;  ????}?Add(?num) 
 ????...+=?num;  ????????tolua_end????protected?m_nNum;  }
;
//
tolua_export 

tolua_begin

?CMessage 

...
{  tolua_end????CMessage() 
 ????...{  ????????strcpy(m_szMessage,?"initial?message);  ????}  ????CMessage(char?*initmsg) 
 ????...if(initmsg)  ????????????strncpy(m_szMessage,?initmsg,0);">256CMessage() 
 ????...?SetMessage(msg) 
 ????...(msg) 
 ????????...{  ????????????strncpy(m_szMessage,?msg,0);">);  ????????}  ????}GetMessage() 
 ????...?m_szMessage;  ????}?ShowMessage() 
 ????...{  ????????printf(this?message?is?printed?in?c++?code?when?lua?call?ShowMessage:%s ,?m_szMessage);  ????}?m_szMessage[];  }
tolua_export
#endif
??? 为了方便,我把实现也放在了头文件中。 ??? 接下来定义pkg文件,tclass.pkg。
$#include?
"
tclass.h



...
????CNumber();  ????CNumber(?num);  ????CNumber();  ?????GetNumber(  }
?CMessage 

...
????CMessage();  ????CMessage(?initmsg);  ????CMessage(msg);  ????GetMessage();  ?????ShowMessage();  ????tolua_export
??? 和我们的第一个数组的例子一样,包含实际的C头文件,用tolua++的语法声明你想导出的部分。在导出类的时候,构造函数被映射到lua中的new,析构函数被映射为delete。他们的用法可以在后面的lua代码中看到。接下来就是用tolua++.exe生成用于完成“导出类到lua”功能的CPP文件了。
????tolua
++
.exe?
-
n?tclass?
o?tclass.cpp?tclass.pkg
??? 把tclass.h和tclass.cpp加入到工程中。编写驱动代码,调用lua脚本文件。这部分如下:
#include?
lua.hpp
 #include?


int
?tolua_tclass_open(lua_State?
*
); 

?_tmain(
?argc,?_TCHAR
?argv[]) 

...
{  ????lua_State?L??luaL_newstate();  ????luaopen_base(L);  ????tolua_tclass_open(L); 
 ????luaL_dofile(L,0);">../scripts/classtest.lua); 
 ????lua_close(L);  ????;  }

??? 编写lua脚本文件classtest.lua,内容如下:
print(
now?in?classtest.lua!
) 

--
new
?a?CNumber?Object  print(
now?allocate?a?CNumber?Object:
)  num
=
CNumber:
()  num2
(
222
)  print(
init,?num:?
..num:GetNumber())  print(
..num2:GetNumber())  print(
now?call?SetNumber(6)
)  num:SetNumber(
6
now?the?num:
..num:GetNumber());  num:delete()  print(
num?is?deleted,?access?GetNumber?is?invalid!
invalid?call,?result:?
..num:GetNumber()) 

?a?CMessage?Object  msg
CMessage:
()  print(
init?msg:?
..msg:GetMessage())  print(
now?change?the?msg?by?call?msg:SetMessage('changed?message')
)  msg:SetMessage(
changed?message
now?msg:?
..msg:GetMessage())  msg:ShowMessage()  msg:delete()  print(
msg?is?deleted,?access?GetMessage?is?invalid!
inivalid?call,0);">..msg:GetMessage()) 
??? OK,简单的几步工作,我们已经可以在lua中使用C++类了。有两点要注意: ??? 1.pkg文件要包含实际的C头文件。 ??? 2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|