C++与Lua交互(五)
引言
要将C++中的对象类型映射到Lua中,就不得不要先了解Lua面向对象的机制。在这里,我们先看一下Lua面向对象的实现基础——metatable,再以此实现C++对象到Lua的映射。
Lua面向对象
不得不先提一下Lua的几种函数写法,普通函数有两种写法:
如果要将一个普通函数赋给一个表,有如下写法:

如果函数里面需要引用表的值,有两种写法:
其中,第二种写法就是一种面向对象的写法了,它隐藏了第一个参数:self。我们还有另一种调用该函数的方式,即通过显示的传递self参数的形式:

至此,看起来有点“面向对象” 的意味了。下面我们通过metatable来实现“继承”的效果,代码如下:

注意其中为Base定义的new方法的实现,在其中通过setmetatable来将Base的metatable赋值给传入的table的metatable。由此实现了“继承”的效果。
将简单的C++对象映射到Lua中
其实,所谓把C++对象映射到Lua中,本质上是把一些对特定数据做操作的函数以metatable的形式包装一下。我们定义如下C++对象:
该类包装了一下整数的加减法操作,并且内部有个计数,记录下该类的实例一共做了多少次加减法。C++中类定义好了,要将它映射到Lua中,有这么几个步骤:1、创建该对象; 2、在Lua中创建一个元表,将C++类中的成员函数映射过去,以便使用Lua的面向对象的语法来操作。首先,我们在Lua中以new这个语义来创建C++中的对象,代码如下:

先在lua中new一个userdata,然后强转指针,接着在改指针指向的内存上调用构造函数。在lua中构造好对象后,将该对象关联元表calculate。
根据上一篇的内容,我们知道,在Lua中注册函数要这么写:

我们将其包含入Lua试试,C++代码与Lua代码分别如下:


输出如下:

啊哈,初步成功了。已经将new的语义映射到Lua中了。下面我们一起再将成员函数映射入Lua。包裹成员函数的代码如下:

有上一篇的基础,看这个应该非常简单。在这里,Lua传进来的第一个参数要是一个Calculate对象,我用#define包裹了一下检查该对象的语句:
由于要将成员函数与元表关联起来,所以在打开库的地方添加一点代码,并且成员映射函数的时候,要在另一个luaL_Reg结构中。代码如下:


在这里,我直接将CalculateToString方法映射为__tostring,那么在lua中输出该对象时,便会自动调用该方法,我们来看看lua的写法:

输出结果如下:

是不是很自然?哈哈。其中Calculate的Sub方法,就留给大家自己去实现了。
总结
Lua中所谓面向对象,在调用函数的写法上,仅仅是将其第一个self参数隐藏传入函数而已。继承的特性,则是通过查询元表所关联的函数来实现。通过以上,可以看到手工将C++对象映射到Lua中是有点繁琐的。下一篇,我们一起用工具来帮我们实现这些代码。
C++与Lua交互(五)的更多相关文章
- C++与Lua交互(四)
引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_pus ...
- C++与Lua交互(一)
引言 之前做手游项目时,客户端用lua做脚本,基本所有游戏逻辑都用它完成,玩起来有点不爽,感觉"太重"了.而我又比较偏服务端这边(仅有C++),所以热情不高.最近,加入了一个端游项 ...
- C++与Lua交互之配置&交互原理&示例
|Lua 简介 Lua 是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放. 某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为. 而修改函 ...
- Lua的五种变量类型、局部变量、全局变量、lua运算符、流程控制if语句_学习笔记02
Lua的五种变量类型.局部变量.全局变量 .lua运算符 .流程控制if语句 Lua代码的注释方式: --当行注释 --[[ 多行注释 ]]-- Lua的5种变量类型: 1.null 表示 ...
- C++与Lua交互(二)
上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...
- 最优雅的C++跟lua交互.
我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...
- C++与Lua交互(三)
通过上一篇的热身,我们对C++调用lua变量有了一个认识,现在让我们再深入一点,去探索一下如何调用lua的函数.表. Lua与宿主通讯的关键--栈 lua是个动态脚本语言,它的数据类型如何映射到C++ ...
- C++与lua交互
项目开发的脚本层用的是Lua,引擎用的是C++.但是经理不给开放引擎层的代码.刚好最近项目空闲,安排了学习C++跟Lua的通信. 一.C++与Lua数据交互 数据交互主要是通过C API来实现 首先, ...
- Linux下C/C++和lua交互-Table
本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边. 最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. ...
随机推荐
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- Tomcat安装、配置、优化及负载均衡详解
一.常见JavaWeb服务器 1.WebLogic:是BEA公司的产品.WebSphereAS:是IBM公司的产品.JBossAS:红帽公司的产品,可以自行了解 2.Tomcat服 ...
- ios开发——面试篇(一)
面试篇之内存管理与多线程 简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为 ...
- 哈夫曼(Huffman)编码
哈夫曼编码(Huffman Coding)是一种非常经典的编码方式,属于可变字长编码(VLC)的一种,通过构造带权路径长度最小的最优二叉树以达到数据压缩的目的.哈弗曼编码实现起来也非常简单,在实际的笔 ...
- Computer Science Theory for the Information Age-3: 高维空间中的高斯分布和随机投影
高维空间中的高斯分布和随机投影 (一)在高维球体表面产生均匀分布点的方法 我们来考虑一个采样问题,就是怎样在高维单位球体的表面上均匀的采样.首先,考虑二维的情况,就是在球形的周长上采样.我们考虑如下方 ...
- 解决用ASP.NET下载文件时,文件名为乱码的问题
关键就一句: string strTemp = System.Web.HttpUtility.UrlEncode(strName, System.Text.Enc ...
- [Java] 多个Map的性能比较(TreeMap、HashMap、ConcurrentSkipListMap)
比较Java原生的 3种Map的效率. 1. TreeMap 2. HashMap 3. ConcurrentSkipListMap 结果: 模拟150W以内海量数据的插入和查找,通过增加和查找 ...
- Write a beautiful button
.btn-warning { color: #fff; text-shadow: 0 -1px 0 rgba(0,0,0,0.25); background-color: #faa732; backg ...
- Android 自学之网格试图(GridView)和图片切换器(ImageSwitcher)功能和用法
网格试图(GridView)用于在界面上按行,列分布的方式来显示多个组件. GridView和ListView有共同的父类:AbsListView,因此GridView和ListView具有一定的相似 ...
- HDU 3085 Nightmare Ⅱ (双向BFS)
Nightmare Ⅱ Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...