• C++与Lua交互(五)


    引言

    要将C++中的对象类型映射到Lua中,就不得不要先了解Lua面向对象的机制。在这里,我们先看一下Lua面向对象的实现基础——metatable,再以此实现C++对象到Lua的映射。

    Lua面向对象

    不得不先提一下Lua的几种函数写法,普通函数有两种写法:

    image 

    如果要将一个普通函数赋给一个表,有如下写法:

    image

    如果函数里面需要引用表的值,有两种写法:

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

    image

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

    image

    注意其中为Base定义的new方法的实现,在其中通过setmetatable来将Base的metatable赋值给传入的table的metatable。由此实现了“继承”的效果。

    将简单的C++对象映射到Lua中

    其实,所谓把C++对象映射到Lua中,本质上是把一些对特定数据做操作的函数以metatable的形式包装一下。我们定义如下C++对象:image

    该类包装了一下整数的加减法操作,并且内部有个计数,记录下该类的实例一共做了多少次加减法。C++中类定义好了,要将它映射到Lua中,有这么几个步骤:1、创建该对象; 2、在Lua中创建一个元表,将C++类中的成员函数映射过去,以便使用Lua的面向对象的语法来操作。首先,我们在Lua中以new这个语义来创建C++中的对象,代码如下:

    image

    先在lua中new一个userdata,然后强转指针,接着在改指针指向的内存上调用构造函数。在lua中构造好对象后,将该对象关联元表calculate。

    根据上一篇的内容,我们知道,在Lua中注册函数要这么写:

    image

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

    imageimage

    输出如下:

    image

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

    image

    有上一篇的基础,看这个应该非常简单。在这里,Lua传进来的第一个参数要是一个Calculate对象,我用#define包裹了一下检查该对象的语句:image

    由于要将成员函数与元表关联起来,所以在打开库的地方添加一点代码,并且成员映射函数的时候,要在另一个luaL_Reg结构中。代码如下:

    image

    image

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

    image

    输出结果如下:

    image

    是不是很自然?哈哈。其中Calculate的Sub方法,就留给大家自己去实现了。

    总结

    Lua中所谓面向对象,在调用函数的写法上,仅仅是将其第一个self参数隐藏传入函数而已。继承的特性,则是通过查询元表所关联的函数来实现。通过以上,可以看到手工将C++对象映射到Lua中是有点繁琐的。下一篇,我们一起用工具来帮我们实现这些代码。

  • 相关阅读:
    CSS记录
    ssl各种证书区别
    【PG数据库】PG数据库的安装及连接方法
    linux 系统 如何 安装 python (python 3.8)
    【学习数据结构数据结构入门1】什么是数据结构?
    Javascript实现复制功能,兼容所有浏览器问题及注意事项
    浏览器版本的全部信息(Javascript)
    正则表达式——多邮箱地址检测 (Regular Expression Mutil Email Checking)
    Fusion网站开发总结_2012322
    CSS开发总结_2012322
  • 原文地址:https://www.cnblogs.com/cdh49/p/3661095.html
Copyright © 2020-2023  润新知