加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

tolua++初探(三)

发布时间:2020-12-14 22:27:52 所属栏目:大数据 来源:网络整理
导读:?将简单C++类导出到lua ??? 利用tolua++导出类到lua中简单方便,你可以导出静态成员函数、普通成员函数、静态成员变量、普通成员变量,你也可以指定类的哪些方法被导出。你可以将具有单继承的派生类导出,派生类可以很自然地访问基类的方法。更多的细节,请
?<将简单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(?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);">256
CMessage()

????
?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
??? 为了方便,我把实现也放在了头文件中。 ??? 接下来定义pkg文件,tclass.pkg。
$#include? " tclass.h

????CNumber();

????CNumber(
?num);

????
CNumber();

????
?GetNumber(

}
?CMessage

????CMessage();

????CMessage(
?initmsg);

????
CMessage(msg);

????
GetMessage();

????
?ShowMessage();

????
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?

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头文件中的一样,只声明你想导出的部分即可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读