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中

扫描二维码关注公众号,回复: 10495331 查看本文章

__index

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

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

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


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

发布了8 篇原创文章 · 获赞 21 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/liumazi/article/details/78935834