<将简单C++类导出到lua> 利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请参考
tolua++的在线文档。 首先生成实际的c++头文件,定义我们要导出的类。tclass.h内容如下:
为了方便,我把实现也放在了头文件中。 接下来定义pkg文件,tclass.pkg。
和我们的第一个数组的例子一样,包含实际的C头文件,用tolua++的语法声明你想导出的部分。在导出类的时候,构造函数被映射到lua中的new,析构函数被映射为delete。他们的用法可以在后面的lua代码中看到。接下来就是用tolua++.exe生成用于完成“导出类到lua”功能的CPP文件了。
把tclass.h和tclass.cpp加入到工程中。编写驱动代码,调用lua脚本文件。这部分如下:
编写lua脚本文件classtest.lua,内容如下:
OK,简单的几步工作,我们已经可以在lua中使用C++类了。有两点要注意: 1.pkg文件要包含实际的C头文件。 2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
#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
$#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
tolua
++
.exe
-
n tclass
-
o tclass.cpp tclass.pkg
#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; }
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())