tolua++初探(三)(转)

本文介绍如何使用tolua++将C++类导出到Lua中,包括类的定义、导出过程及使用示例。通过生成C++头文件和pkg文件,可以方便地在Lua中调用C++类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<将简单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, "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
   
为了方便,我把实现也放在了头文件中。     接下来定义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 - n tclass - o tclass.cpp tclass.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( " 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())
    OK,简单的几步工作,我们已经可以在lua中使用C++类了。

有两点要注意:    
1.pkg文件要包含实际的C头文件。    
2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值