ToLua++原理简析

每一个C++类有一个metatable


类中的成员函数是直接以<函数名, 函数地址>存在metatable中的;

类中的成员变量则会生成存取函数并分别将<变量名, 存/取函数地址>存入metatable中名为".set"/".get"的二级table中;

子类的metatable的metatable是父类的metatable;


每个metatable都会被设置一组metamethod  比如__newindex/__index  其中:

__newindex

  首先获取当前对象的metatable 然后寻找对应的".seti"/".set"函数 找不到则继续向上在父类的metatable中寻找 ...

  最终 如果找到则调用对应的".seti"/".set"函数  

  找不到则说明不是C++类原有的成员函数/变量 调用storeatubox将<k,v>存到当前对象的私有table中

__index

  首先在当前对象的私有table中寻找  如果没有的话 获取当前对象的metatable 

  然后和上述过程类似  递归地寻找对应的".geti"/".get" 找到则调用 找不到则返回nil

  (如果k是整数的话, 寻找".geti";  否则先查询metatable中是否有[k] 没有的话再寻找".get")


每一个C++对象 传进Lua时 传的都是一个userdata 这个userdata里面存的是C++对象的地址  同时 这个userdata的metatable是该对象的类的metatable

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值