<将简单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,
"
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
$#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
-
ntclass
-
otclass.cpptclass.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(
"
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())