引言

要将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. delphi 为应用程序添加提示

    type  TForm1 = class(TForm)    Button1: TButton;    Panel1: TPanel;    Edit1: TEdit;    procedure Fo ...

  2. iOS开发——混编Swift篇&OC移植为swift

    将Ojective-C代码移植转换为Swift代码 2015-03-09 15:07发布:yuhang浏览:201   相比于Objective-C,Swift语言更加简练.有时我们需要把原来写的一些 ...

  3. ActionScript 3 中的强制类型转换

    以前AS中是这样进行强制类型转换的:假设有一个类叫做Class1,我们声明了一个它的对象 c1,如果想要将它转换成Class2类型,只要这样写: Class2(c1); 在AS3中你依然可以这样写,但 ...

  4. [原 -> 砖] C# IEnumerable<T>泛型取值

    为什么要写这个?因为发现,很多人在读取泛型集合中Item的值时,使用的方法是 item.GetType().GetField("xxxxx").GetValue() 或类似的写法. ...

  5. QQWry.dat 数据写入

    纯真IP库 数据多,更新及时,很多同学在用,网上关于其读取的帖子也有不少(当然其中有一些是有BUG的),但却很少有关于其写入的帖子.OK,下面分享下写QQWry.dat. QQWry.dat 分三个部 ...

  6. js new date详解

    创建一个日期对象: var objDate=new Date([arguments list]); var ini_date=new Date(2014,7,0); //是代表7月最后一天 ,也就是2 ...

  7. selenium python 环境搭建(64位 windows)

    之前写了同样的文章,可是后来自己按照给文章再次搭建环境当搭建环境成功后却发现还是无法用.使用from selenium import webdriver,在run的时候却出现ImportError: ...

  8. org.apache.hadoop.fs-BufferedFSInputStream

    封装了FSInputStream package org.apache.hadoop.fs; import java.io.BufferedInputStream; import java.io.IO ...

  9. 初始tornado框架

    2.7版本的一个简单的框架 from wsgiref.simple_server import make_server def new(): return 'new' def index(): ret ...

  10. [Javascript,JSON] JQuery处理json与ajax返回JSON实例

    转自:http://www.php100.com/html/program/jquery/2013/0905/5912.html [导读] json数据是一种经型的实时数据交互的数据存储方法,使用到最 ...