tolua++初探(三)

 <将简单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, "initial message");     }     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("this message is printed in c++ code when lua call ShowMessage:%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  - n tclass  - o tclass.cpp tclass.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 *= luaL_newstate();     luaopen_base(L);     tolua_tclass_open(L);     luaL_dofile(L, "../scripts/classtest.lua");     lua_close(L);     return 0; }
    编写lua脚本文件classtest.lua,内容如下:
print( " now in classtest.lua! " ) -- new  a CNumber Object print( " now allocate a CNumber Object: " ) num = CNumber: new () num2 = CNumber: new ( 222 ) print( " init, num:  " ..num:GetNumber()) print( " init, num2:  " ..num2:GetNumber()) print( " now call SetNumber(6) " ) num:SetNumber( 6 ) print( " now the num: " ..num:GetNumber()); num:delete() print( " num is deleted, access GetNumber is invalid! " ) print( " invalid call, result:  " ..num:GetNumber()) -- new  a CMessage Object msg = CMessage: new () print( " init msg:  " ..msg:GetMessage()) print( " now change the msg by call msg:SetMessage('changed message') " ) msg:SetMessage( " changed message " ) print( " now msg:  " ..msg:GetMessage()) msg:ShowMessage() msg:delete() print( " msg is deleted, access GetMessage is invalid! " ) print( " inivalid call, result:  " ..msg:GetMessage())
    OK,简单的几步工作,我们已经可以在lua中使用C++类了。有两点要注意:     1.pkg文件要包含实际的C头文件。     2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。

你可能感兴趣的:(c,工作,脚本,delete,lua,文档)