<將簡單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頭文件中的一樣,只聲明你想導出的部分即可。






















































































































































更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
