tolua++初探(三)
发布时间:2020-12-14 22:27:52 所属栏目:大数据 来源:网络整理
导读:?将简单C++类导出到lua ??? 利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请
?<将简单C++类导出到lua> ??? 利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请参考
tolua++的在线文档。 ??? 首先生成实际的c++头文件,定义我们要导出的类。tclass.h内容如下:
??? 和我们的第一个数组的例子一样,包含实际的C头文件,用tolua++的语法声明你想导出的部分。在导出类的时候,构造函数被映射到lua中的new,析构函数被映射为delete。他们的用法可以在后面的lua代码中看到。接下来就是用tolua++.exe生成用于完成“导出类到lua”功能的CPP文件了。
#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(?num) ????{ ????????m_nNum?=?num; ????}?GetNumber() ????{ ????????return?m_nNum; ????}?Add(?num) ????+=?num; ????????tolua_end????protected?m_nNum; }
;
//
tolua_export
tolua_begin
?CMessage
{ tolua_end????CMessage() ????{ ????????strcpy(m_szMessage,?"initial?message); ????} ????CMessage(char?*initmsg) ????if(initmsg) ????????????strncpy(m_szMessage,?initmsg,0);">256CMessage() ?????SetMessage(msg) ????(msg) ????????{ ????????????strncpy(m_szMessage,?msg,0);">); ????????} ????}GetMessage() ?????m_szMessage; ????}?ShowMessage() ????{ ????????printf(this?message?is?printed?in?c++?code?when?lua?call?ShowMessage:%s ,?m_szMessage); ????}?m_szMessage[]; }
tolua_export
#endif
$#include?
"
tclass.h
????CNumber(); ????CNumber(?num); ????CNumber(); ?????GetNumber( }
?CMessage
????CMessage(); ????CMessage(?initmsg); ????CMessage(msg); ????GetMessage(); ?????ShowMessage(); ????tolua_export
????tolua
++
.exe?
-
n?tclass?
o?tclass.cpp?tclass.pkg
??? 把tclass.h和tclass.cpp加入到工程中。编写驱动代码,调用lua脚本文件。这部分如下:
#include?
lua.hpp
#include?
int
?tolua_tclass_open(lua_State?
*
);
?_tmain(
?argc,?_TCHAR
?argv[])
{ ????lua_State?L??luaL_newstate(); ????luaopen_base(L); ????tolua_tclass_open(L); ????luaL_dofile(L,0);">../scripts/classtest.lua); ????lua_close(L); ????; }
??? 编写lua脚本文件classtest.lua,内容如下:
print(
now?in?classtest.lua!
)
--
new
?a?CNumber?Object print(
now?allocate?a?CNumber?Object:
) num
=
CNumber:
() num2
(
222
) print(
init,?num:?
..num:GetNumber()) print(
..num2:GetNumber()) print(
now?call?SetNumber(6)
) num:SetNumber(
6
now?the?num:
..num:GetNumber()); num:delete() print(
num?is?deleted,?access?GetNumber?is?invalid!
invalid?call,?result:?
..num:GetNumber())
?a?CMessage?Object msg
CMessage:
() print(
init?msg:?
..msg:GetMessage()) print(
now?change?the?msg?by?call?msg:SetMessage('changed?message')
) msg:SetMessage(
changed?message
now?msg:?
..msg:GetMessage()) msg:ShowMessage() msg:delete() print(
msg?is?deleted,?access?GetMessage?is?invalid!
inivalid?call,0);">..msg:GetMessage())
??? OK,简单的几步工作,我们已经可以在lua中使用C++类了。有两点要注意: ??? 1.pkg文件要包含实际的C头文件。 ??? 2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |