引言

要将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交互(五)的更多相关文章

  1. C++与Lua交互(四)

    引言 通过前几篇,我们已经对Lua的C API有了一定的了解,如lua_push*.lua_is*.lua_to*等等.用C++调用Lua数据时,我们主要运用lua_getglobal与lua_pus ...

  2. C++与Lua交互(一)

    引言 之前做手游项目时,客户端用lua做脚本,基本所有游戏逻辑都用它完成,玩起来有点不爽,感觉"太重"了.而我又比较偏服务端这边(仅有C++),所以热情不高.最近,加入了一个端游项 ...

  3. C++与Lua交互之配置&交互原理&示例

    |Lua 简介 Lua 是一种轻量小巧的脚本语言,也是号称性能最高的脚本语言,它用C语言编写并以源代码形式开放. 某些程序常常需要修改内容,而修改的内容不仅仅是数据,更要修改很多函数的行为. 而修改函 ...

  4. Lua的五种变量类型、局部变量、全局变量、lua运算符、流程控制if语句_学习笔记02

    Lua的五种变量类型.局部变量.全局变量 .lua运算符 .流程控制if语句 Lua代码的注释方式: --当行注释 --[[    多行注释    ]]-- Lua的5种变量类型: 1.null 表示 ...

  5. C++与Lua交互(二)

    上一篇我们搭建好了整个的项目环境,现在,我们一起探索一下如何将lua寄宿到C++中. 宿主的实现 我们在LuaWithCPPTest项目下,查看Source.cpp代码如下: #include < ...

  6. 最优雅的C++跟lua交互.

    我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...

  7. C++与Lua交互(三)

    通过上一篇的热身,我们对C++调用lua变量有了一个认识,现在让我们再深入一点,去探索一下如何调用lua的函数.表. Lua与宿主通讯的关键--栈 lua是个动态脚本语言,它的数据类型如何映射到C++ ...

  8. C++与lua交互

    项目开发的脚本层用的是Lua,引擎用的是C++.但是经理不给开放引擎层的代码.刚好最近项目空闲,安排了学习C++跟Lua的通信. 一.C++与Lua数据交互 数据交互主要是通过C API来实现 首先, ...

  9. Linux下C/C++和lua交互-Table

    本来这些文章都是在我的个人网站www.zhangyi.studio,目前处在备案状态,暂时访问不了,所以搬到这边.  最近这两天需要弄清楚C++和lua间相互调用和数据传递,废话不多说,直接上过程. ...

随机推荐

  1. pjsip视频通信开发(上层应用)之数字键盘的制作

    在pjsip视频通信开发(上层应用)之EditText重写中我制作了一个显示输入内容的EditText,这里将制作一个数字键盘,其实跟计算器一样,最多的就是用TableLayout来实现,内部通过权重 ...

  2. STM8的wait for interrupt

    如果我用disable interrupt和enable interrupt包裹wait forinterrupt(WFI).你说WFI还能被唤醒么?有思考过么? 昨晚拿STM8L151K4的开发板, ...

  3. 在线服务之socket编程科普

    简介 本篇文章是介绍一个典型的在线C++服务的最底层socket管理是如何实现的. 文章会从一个最简单的利用socket编程基础API的一个小程序开始,逐步引入现在典型的select,epoll机制, ...

  4. LINUX 内核2

    http://blog.csdn.net/acs713/article/category/1363650

  5. oracle SELECT INTO 和 INSERT INTO SELECT 两种表复制语句详解

    我们经常会遇到需要表复制的情况,如将一个table1的数据的部分字段复制到table2中,或者将整个table1复制到table2中,这时候我们就要使用SELECT INTO 和 INSERT INT ...

  6. Step-by-Step XML Free Spring MVC 3 Configuration--reference

    The release of Spring 2.5 reduce the burden of XML by introduction annotation based configuration, b ...

  7. Redis 数据备份与恢复

    Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 redis 127.0.0.1: ...

  8. 琐碎-hadoop2.2.0目录结构

    之前了解了一下0.20.2和1.1.0.以后现在主流肯定是2.x吧,包含了之前没有的yarn bin Hadoop最基本的管理脚本和使用脚本,这些脚本是sbin目录下管理脚本的基础实现,用户可以用这些 ...

  9. iOS 10 的适配问题

    随着iOS10发布的临近,大家的App都需要适配iOS10,下面是我总结的一些关于iOS10适配方面的问题,如果有错误,欢迎指出. 1.系统判断方法失效: 在你的项目中,当需要判断系统版本的话,不要使 ...

  10. Java中的Scoket编程

    网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来. java.net包中提供了两种常见的网络协议的支持: TCP: TCP是传输控制协议的缩写,它保障了两个应用程序之间的可靠 ...