<使用了聚合的类的导出>
聚合是最常见的构造新类的方式了,另一个是继承。tolua++支持单继承,后面会提到继承的例子。这里先看看怎么将利用了聚合的类导出到lua中。
我的目的是想在Lua中使用C++类的实例,而不是在lua中生成C++类实例,所以我在利用tolua++向lua导出类时一般不导出构造函数,这样就无法在lua中生成类实例。
但是为了演示的方便,这个例子中用到的两个简单类CNumber和CMessage仍然导出了构造函数。
另外一个单件(singleton)CTestSystem的构造函数、拷贝构造函数、=操作符都被声明为protected,在向lua导出时只导出了几个方法。你无法在lua中生成它的实例,即便在C++中也不行,只能通过其静态成员函数GetSingleton()获取。
实际的头文件classg.h如下:
#ifndef_CLASSGROUP_H
#define_CLASSGROUP_H
#include<string.h>
classCNumber...{//tolua_export
public:
//tolua_begin
CNumber():m_nNum(0)
...{
}
CNumber(intnum):m_nNum(num)
...{
}
~CNumber()
...{
}
voidSetNumber(intnum)
...{
m_nNum=num;
}
intGetNumber()
...{
returnm_nNum;
}
intAdd(intnum)
...{
m_nNum+=num;
returnm_nNum;
}
//tolua_end
protected:
intm_nNum;
};//tolua_export
//tolua_begin
classCMessage
...{
//tolua_end
public:
//tolua_begin
CMessage()
...{
strcpy(m_szMessage,"initialmessage");
}
CMessage(char*initmsg)
...{
if(initmsg)
strncpy(m_szMessage,initmsg,256);
}
~CMessage()
...{
}
voidSetMessage(char*msg)
...{
if(msg)
...{
strncpy(m_szMessage,msg,256);
}
}
char*GetMessage()
...{
returnm_szMessage;
}
voidShowMessage()
...{
printf("thismessageisprintedinc++codewhenluacallShowMessage:%s ",m_szMessage);
}
//tolua_end
protected:
charm_szMessage[256];
};//tolua_export
classCTestSystem...{
public:
staticCTestSystem&GetSingleton()...{staticCTestSystemsys;returnsys;}
CNumber&GetNumberObj()...{returnm_Number;}
CMessage&GetMessageObj()...{returnm_Message;}
protected:
CTestSystem()...{}
CTestSystem(constCTestSystem&);
CTestSystem&operator=(constCTestSystem&rhs);
~CTestSystem()...{}
private:
CNumberm_Number;
CMessagem_Message;
};
#endif
接下来是pkg文件:
$#include"classg.h"
classCNumber...{//tolua_export
public:
//tolua_begin
CNumber();
CNumber(intnum);
~CNumber(void);
voidSetNumber(intnum);
intGetNumber(void);
intAdd(intnum);
//tolua_end
};//tolua_export
//tolua_begin
classCMessage
...{
//tolua_end
public:
//tolua_begin
CMessage(void);
CMessage(char*initmsg);
~CMessage(void);
voidSetMessage(char*msg);
char*GetMessage();
voidShowMessage();
//tolua_end
};//tolua_export
classCTestSystem
...{
staticCTestSystem&GetSingleton();
CNumber&GetNumberObj();
CMessage&GetMessageObj();
};
我只导出需要的部分。有点遗憾的是,tolua++的手册中说无法通过"@"修改你要导出的类的名字,这样的话,如果我想在lua中使用另外的名字,就要用别的办法了(文档中说$renaming可以,未试验,存疑)。
驱动部分和之前的例子中类似:
#include"classg.h"
#include"lua.hpp"
inttolua_classgroup_open(lua_State*);
int_tmain(intargc,_TCHAR*argv[])
...{
lua_State*L=luaL_newstate();
luaopen_base(L);
tolua_classgroup_open(L);
luaL_dofile(L,"../scripts/classgroup.lua");
lua_close(L);
return0;
}
一直没有介绍上面用到的几个函数。在lua5.1中,用来生成lua状态对象的lua_open函数不再直接可用,替换为lua_newstate,不过lua_newstate要提供内存分配函数,lua扩展库提供了无参数的luaL_newstate,用起来方面。同时为了向前兼容,还做了宏定义#define lua_open luaL_newstate()。所以你仍然可以用lua_open来或者lua_State,但是要注意这里只是个宏。
luaopen_base()打开基本的库。
tolua_classgroup_open是tolua++生成的函数,用来向lua导出你定义的类和其它变量及函数。
luaL_dofile也是宏定义,用来加载并执行一个脚本文件,在lauxlib.h中定义。
lua_close关闭之前打开的状态块。
关于这些函数的详细说明,请参考
lua5.1在线文档。
下面是classgroup.lua文件:
print("nowinclassgroup.lua!")
print("gettheCTestSystemsingleton,callGetNumberObjandGetMessageObj:")
singleton=CTestSystem:GetSingleton();
print(singleton)
numobj=singleton:GetNumberObj();
print(numobj)
msgobj=singleton:GetMessageObj();
print(msgobj)
--accessCNumberandCMessage
print("initnumobj'snumber:"..numobj:GetNumber());
numobj:SetNumber(100);
print("aftercallnumobj:SetNumber(100),changednumber:"..numobj:GetNumber())
print("initmsgobj'smessage:"..msgobj:GetMessage());
msgobj:SetMessage("Thismessageissetinluascript");
print("newmessage:"..msgobj:GetMessage())
msgobj:ShowMessage()
OK,这是个简单的例子,我们只用到了tolua++最基本的东西,进一步的研究学习可以琢磨它的文档。但是我用luaplus想做到这一点,费了不少力气。相对luaplus,tolua++在导出类到lua方面更为方便好用,而luaplus用来访问lua脚本则比tolua++方便(隔离了繁琐的虚拟栈操作)。两个封装的侧重点不同,如果可以结合起来,会非常有趣,双向的访问都很方便。有时间的话我会尝试一下。
接下来会试验一下单继承。
==**==
刚才试验了下$renaming 可以用。在pkg后加入$renaming CTestSystem @ lSystems,用tolua++编译,然后编译工程,则必须修改classgroup.lua,
将singleton=CTestSystem:GetSingleton();改为singleton= lSystems:GetSingleton();。
分享到:
相关推荐
tolua++-1.0.93.tar.bz
tolua++参考手册中文版-[刘源霖(译)] PDF格式 写的很详细 留给需要的人
这是tolua++-1.0.92版本的源码,支持各种常用的平台。编译方法在自带的INSTALL中有描述。本人在windows7上用VS2012编译过,里面有二个工程,一个是编译生成tolua++.exe的,另一个是本人自己添加的,用来生成tolua++....
tolua++ 编译 及使用 简单介绍 tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。
tolua++-1.0.92 源码 tolua++ is an extended version of tolua, a tool to integrate C/C++ code with Lua. tolua++ includes new features oriented to c++ such as: Support for std::string as a basic type ...
Lua c++ ,tolua++工具注册C++类
lua和c++通过tolua++互调,内含有demo,以及tolua++.exe,lua5.1
lua5.1.4类库和tolua++1.0.93类库及工具打包 使用CodeBlocks 8.02 gcc 3.4.5编译的 lua 5.1.4 tolua++ 1.0.93 文件列表 liblua.a,libtolua++.a,lua51.dll,lua.exe,luac.exe,tolua++.exe
编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用
tolua++编译pkg脚本工具及CurlDown源码,源码和工具在:toluapp-master\bin 目录下面,附tolua++ pkg脚本教程。
tolua++ 源代码,希望各位大侠能够看懂,希望你们维护它,它很强
编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用
tolua++.exe 可执行,带liblua.dll,lua.dll
关于tolua++的资料太少,这个通过实例让你知道如何通过tolua++和C++交互,简单明了。 通过5个文件来演示这个tolua++版 hello world hello.lua ,hello.h ,hello.pkg ,Main.cpp ,build_pgk.bat 1.启动CodeBlocks...
本文是tolua++学习的入门教程,包括tolua++简介、tolua++资源文件编译 tolua++示例程序
tolua++的源码和代码生成工具,已经建好了项目,只要将新建解决方案,然后将项目加进去。当然你还是要自己将lua库和头文件链接过去
tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件. tolua使用例子.
tolua++工具的测试,lua脚本测试. vs7编译。 包含完整编译环境,lib,inc.
使用tolua++ 工具导出c++文件到lua接口, 包含全部工具及演示代码,条理清晰,简单易懂。https://blog.csdn.net/u012278016/article/details/101269992