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间相互调用和数据传递,废话不多说,直接上过程. ...
随机推荐
- velocity模板技术生成word文档
本文介绍採用velocity技术在Java中生成word文档的方法. 1.新建一个word文档,编辑内容例如以下: 2.将上述word文档另存为htm格式的文件 3.新建一个Java Project项 ...
- Pimp_my_Z1
https://github.com/Androguide/Pimp_my_Z1 Pimp_my_Z1-master.zip
- HelloSpark.scala
/** * Created by root on 9/6/15. */ import org.apache.spark.SparkContext import org.apache.spark.Spa ...
- C++_归并排序(纯C版)
#include <iostream> #include <stdlib.h> using namespace std; int compared(const void *ke ...
- Linux shell 脚本攻略之正则表达式入门
摘自:<Linux shell 脚本攻略> 下面是类似的解释:
- 3d ListView翻译
作为一个刚毕业的大学生,我要提醒自己时时刻刻要学习. 最近做listview看到很久以前的一个demo,高手如云啊,我们就只有好好加油了. 这是索尼公司的一个员工写的学习博客,由于本人英文能力有限是按 ...
- CentOS(三)--初识linux的文件系统以及用户组等概念
进入到了Linux学习之CentOS第三篇了,这篇文章主要记录下对linux文件系统的初步认识,以及用户组.用户权限.文件所有者.文件所在组等概念 一.Linux文件结构及基本文件夹 文件系统是Lin ...
- [改善Java代码]不要在构造函数中抛出异常
Java的异常机制有三种: 一.Error类以及其子类表示的是错误,它是不需要程序员处理也不能处理的异常.比如VirtualMachineError虚拟机错误,ThreadDeath线程僵尸等. 二. ...
- webkit,HTML5头部标签
大家都知道在移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析html代码,更好地将移动web前端页面表现出来.本文整理一些HTML5头部<meta>标签常用的 ...
- CSS/块级元素与内联元素的深入理解
今天终于对html中的块级元素和行内元素有了一个较为理性的认识.首先w3c对于block和inline的解释为: