tolua++初探(三)(转)
来源:互联网 发布:雕刻机 编程 编辑:程序博客网 时间:2024/05/21 11:12
<将简单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头文件中的一样,只声明你想导出的部分即可。
利用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
#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
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-n tclass -o tclass.cpp tclass.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;
}
#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("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())
--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())
有两点要注意:
1.pkg文件要包含实际的C头文件。
2.pkg文件中要声明需要导出到lua中的类,类名与实际的C头文件中的一样,只声明你想导出的部分即可。
- tolua++初探(三)(转)
- tolua++初探(三)
- tolua++初探(一)(转)
- tolua++初探(二)(转)
- tolua++初探(四)(转)
- tolua++初探(五)(转)
- tolua++初探(六)(转)
- tolua++初探(七)(转)
- tolua++初探(八)(转)
- tolua++初探(九)(转)
- tolua++初探(一)
- tolua++初探(二)
- tolua++初探(四)
- tolua++初探(五)
- tolua++初探(六)
- TOLUA++初探
- tolua++初探
- tolua总结(三)
- Ubuntu下shell中无法source的解决办法
- tolua++初探(二)(转)
- Mysql中使用like进行模糊查询反斜线等符号转义处理
- 带颜色小圆圈进度条
- Linux下/etc/resolv.conf 配置DNS客户
- tolua++初探(三)(转)
- Java 学习排序
- NDK7编译c++
- UPnP(这篇写得更清晰)
- Android 软键盘遮挡控件的解决办法
- 一亿用户增长背后的架构秘密
- Moglue:无需编程的交互式电子书制作软件(视频演示)
- 值得收藏的一些网页代码(ASP,JS,HTML)
- MySQL prepare语句的SQL语法