`
king_tt
  • 浏览: 2108554 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

tolua++初探(四)

 
阅读更多
<使用了聚合的类的导出> 聚合是最常见的构造新类的方式了,另一个是继承。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

    tolua++-1.0.93.tar.bz

    tolua++参考手册中文版-[刘源霖(译)].rar

    tolua++参考手册中文版-[刘源霖(译)] PDF格式 写的很详细 留给需要的人

    tolua++-1.0.92源码

    这是tolua++-1.0.92版本的源码,支持各种常用的平台。编译方法在自带的INSTALL中有描述。本人在windows7上用VS2012编译过,里面有二个工程,一个是编译生成tolua++.exe的,另一个是本人自己添加的,用来生成tolua++....

    tolua++ 编译 及使用 简单介绍

    tolua++ 编译 及使用 简单介绍 tolua++ 是用来把 C++代码 生成 在Lua中使用的接口的工具,编译步骤比较繁琐。

    tolua++ 1.0.92

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

    tolua++ tool test

    Lua c++ ,tolua++工具注册C++类

    lua和C++通过tolua++进行互调的demo

    lua和c++通过tolua++互调,内含有demo,以及tolua++.exe,lua5.1

    lua5.1.4类库和tolua++1.0.93类库及工具打包

    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编译器(Mac版)

    编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用

    tolua++编译pkg脚本工具及CurlDown源码

    tolua++编译pkg脚本工具及CurlDown源码,源码和工具在:toluapp-master\bin 目录下面,附tolua++ pkg脚本教程。

    toLUA++ 1.0.92

    tolua++ 源代码,希望各位大侠能够看懂,希望你们维护它,它很强

    tolua++1.0.93编译器 (win版)

    编译好的tolua++ 编译器基于1.0.93版编译,可以直接使用

    tolua++ 1.0.93

    tolua++.exe 可执行,带liblua.dll,lua.dll

    tolua++ 版helloworld (lua脚本调用C++类的成员函数方法)

    关于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++示例程序

    tolua++源码

    tolua++的源码和代码生成工具,已经建好了项目,只要将新建解决方案,然后将项目加进去。当然你还是要自己将lua库和头文件链接过去

    tolua ++ 使用例子

    tolua++是一种第三方的软件包,可以为Lua提供面向对象的特性,这样我们就可以使用Lua来编写使用C++语言库的脚本文件. tolua使用例子.

    tolua++测试

    tolua++工具的测试,lua脚本测试. vs7编译。 包含完整编译环境,lib,inc.

    toLua++工具及易懂演示实例.zip

    使用tolua++ 工具导出c++文件到lua接口, 包含全部工具及演示代码,条理清晰,简单易懂。https://blog.csdn.net/u012278016/article/details/101269992

Global site tag (gtag.js) - Google Analytics