tolua++初探(三)

系统 1622 0
<将简单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( int num) ... { m_nNum = num; } int GetNumber() ... { return m_nNum; } int Add( int num) ... { m_nNum += num; return m_nNum; } // tolua_end protected : int m_nNum; } ; // tolua_export // tolua_begin class CMessage ... { // tolua_end public : // tolua_begin CMessage() ... { strcpy(m_szMessage, " initialmessage " ); } CMessage( char * initmsg) ... { if (initmsg) strncpy(m_szMessage,initmsg, 256 ); } ~ CMessage() ... { } void SetMessage( char * msg) ... { if (msg) ... { strncpy(m_szMessage,msg, 256 ); } } char * GetMessage() ... { return m_szMessage; } void ShowMessage() ... { printf( " thismessageisprintedinc++codewhenluacallShowMessage:%s " ,m_szMessage); } // tolua_end protected : char m_szMessage[ 256 ]; } ; // tolua_export #endif
为了方便,我把实现也放在了头文件中。 接下来定义pkg文件,tclass.pkg。
$#include " tclass.h " class CNumber ... { // tolua_export public : // tolua_begin CNumber(); CNumber( int num); ~ CNumber( void ); void SetNumber( int num); int GetNumber( void ); int Add( int num); // tolua_end } ; // tolua_export // tolua_begin class CMessage ... { // tolua_end public : // tolua_begin CMessage( void ); CMessage( char * initmsg); ~ CMessage( void ); void SetMessage( char * msg); char * GetMessage(); void ShowMessage(); // tolua_end } ; // tolua_export
和我们的第一个数组的例子一样,包含实际的C头文件,用tolua++的语法声明你想导出的部分。在导出类的时候,构造函数被映射到lua中的new,析构函数被映射为delete。他们的用法可以在后面的lua代码中看到。接下来就是用tolua++.exe生成用于完成“导出类到lua”功能的CPP文件了。
tolua ++ .exe - ntclass - otclass.cpptclass.pkg
把tclass.h和tclass.cpp加入到工程中。编写驱动代码,调用lua脚本文件。这部分如下:
#include " lua.hpp " #include " tclass.h " int tolua_tclass_open(lua_State * ); int _tmain( int argc,_TCHAR * argv[]) ... { lua_State * L = luaL_newstate(); luaopen_base(L); tolua_tclass_open(L); luaL_dofile(L, " ../scripts/classtest.lua " ); lua_close(L); return 0 ; }
编写lua脚本文件classtest.lua,内容如下:
print( " nowinclasstest.lua! " ) -- new aCNumberObject print( " nowallocateaCNumberObject: " ) num = CNumber: new () num2 = CNumber: new ( 222 ) print( " init,num: " ..num:GetNumber()) print( " init,num2: " ..num2:GetNumber()) print( " nowcallSetNumber(6) " ) num:SetNumber( 6 ) print( " nowthenum: " ..num:GetNumber()); num:delete() print( " numisdeleted,accessGetNumberisinvalid! " ) print( " invalidcall,result: " ..num:GetNumber()) -- new aCMessageObject msg = CMessage: new () print( " initmsg: " ..msg:GetMessage()) print( " nowchangethemsgbycallmsg:SetMessage('changedmessage') " ) msg:SetMessage( " changedmessage " ) print( " nowmsg: " ..msg:GetMessage()) msg:ShowMessage() msg:delete() print( " msgisdeleted,accessGetMessageisinvalid! " ) print( " inivalidcall,result: " ..msg:GetMessage())
OK,简单的几步工作,我们已经可以在lua中使用C++类了。有两点要注意: 1.pkg文件要包含实际的C头文件。 2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。

tolua++初探(三)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论