一个使用c++在lua中创建自定义数据类型的简易方法
来源:互联网 发布:金山软件上市部分 编辑:程序博客网 时间:2024/05/07 07:50
lua是一个内嵌式的语言,很多初学者对于lua中使用c++类中的函数,或者用c++直接创建一个自己的自定义数据类型比较头疼,因为这部分确实比较乱,牵扯到内存释放分配等问题,但是如果把其中关系理清,还是很简单的,下面这段代码是一个老外写的,我做了一些修改。首先看代码。
以上是一个头文件,包含到代码中,直接就可以使用。
这段代码的用处是将一个c++类包装成lua中的自定义数据类型。
在类声明中要添加如 LUNA_CLASS_D_DEFAULT_VALS宏:
这个类实现了一个luaprint函数,他只会输出一个字符串。
在类声明的最后,要把这个宏加上,宏的第一个参数是类名,第二个参数是一个任意类型的指针,目前没用。
我们现在看看LUNA_CLASS_D_DEFAULT_VALS是什么
这个宏在类中添加了3个变量,其中m_pLink目前没用,className是一个字符串数组,用来保存类名,而Register是一个RegType类型的数组。
RegType是一个结构如下:
struct RegType {
const char *name;
int(T::*mfunc)(lua_State*);
};
这个结构保存一个c++类中的函数。他将在下面的部分进行初始化。
下面将要在类声明外进行刚刚那些变量的初始化工作,他们是由下面这些宏组成
LUNA_CLASS_D_INIT_VALS_CLASSNAME(aa,void)
LUNA_CLASS_D_INIT_VALS_FUNCNAME_START(aa)
LUNA_CLASS_D_INIT_VALS_FUNCNAME_USER(luaprint,aa)
LUNA_CLASS_D_INIT_VALS_FUNCNAME_END
首先LUNA_CLASS_D_INIT_VALS_CLASSNAME宏初始化m_pLink和className变量,而下面三个宏初始化RegType变量。
如果类中还有其他函数,并且他符合int(T::*mfunc)(lua_State*);的样式,那么就可以用LUNA_CLASS_D_INIT_VALS_FUNCNAME_USER添加进来。
那么,这个类就已经包装好,等待放到lua中。之所以说等待,是因为我们需要将这个类注册到lua中,好让lua知道,这样我们在lua中才能调用。
注册方法是,在程序启动的时候调用luna_register( ls, aa )宏。
其中ls是lua_state,aa是刚刚包装的类
至此,在lua中之需要下面这样,就可以轻松调用c函数了
local test = aa()
test:luaprint("123")
以上是这个luna模板最基本的应用
其他还有
LUNA_CLASS_D_INIT_VALS_FUNCNAME_ALIAS_USER用于将一个函数声明为其他名称,比如想实现lua中元表的__index函数:
LUNA_CLASS_D_INIT_VALS_FUNCNAME_ALIAS_USER(luaprint,aa,"__index")
这样,当任何对自定义函数的取值操作,都将调用luaprint函数,当然,如果不修改luaprint函数,结果肯定是错误的,__index函数必须返回一个值。
luna_register_singleton 宏用于注册一个Ogre::Singleton的派生类,一般用于lua访问c环境中全局唯一实例的类
BUILD_LUACLASS宏用于创建一个已经注册的类的新实例,并且放到当前堆栈中。
BUILD_LUACLASS_LP宏用于创建一个已经注册的类,其指针是c++提供,并且由c++释放。
- 一个使用c++在lua中创建自定义数据类型的简易方法
- 一个使用c++在lua中创建自定义数据类型的简易方法
- quick-Cocos2d/framework/functions.lua(提供了我们在Lua中创建一个自定义类的快捷方法class、克隆等功能)
- 在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 如何在cocos2dx中使用Lua创建自定义
- 在java中使用和创建自定义的native方法
- Lua的系统学习(杂)_使用uLua在Unity中创建一个Sphere小球
- 【Cocos2dX(2.x)_Lua开发之三】在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- ★重要必看篇★在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
- 在lua中使用cocostudio创建的滚动条
- 一个在游戏中使用的脚本语言---LUA
- C调用LUA创建一个简单的LUA解释器
- 在lua中使用C语言编写的库
- 在Lua中使用自己的C函数
- 在lua中使用C语言编写的库
- visio中创建自定义的数据类型
- 如何在Qt中使用自定义数据类型
- 如何在Qt中使用自定义数据类型
- 数据库 分页功能
- 6个变态的C语言Hello World程序
- [C++/CLI编程宝典][1]C++/CLI资料汇总
- 有趣的缩写I18N,L10N及延伸知识
- 日文邮件用语
- 一个使用c++在lua中创建自定义数据类型的简易方法
- 日语邮件用语2
- 恐怖的C++语言
- 邮件收发方面的日语词汇
- [C++/CLI编程宝典][2]什么是C++/CLI语言
- [C++/CLI编程宝典][3]C++/CLI能做什么
- aspnet_regsql.exe 注册不上 本机的 SQL Server
- 程序员考核的五大死因
- [C++/CLI编程宝典][4]第一个C++/CLI程序