结果:
class{#A :
private:
#a,
method:
public:
method:
#__init__ : 0, #__del__ : 0, #mGetA : 10838112, #mSetA : 10835952
}
class obj{#A :
private:
#a : 5,
public:
}
5
从头文件LuSystem32.h中可找到的类(class)定义如下:
struct SClass{ //类定义
luVOID me; //类名字,是一个以#开头的标识符(字符串)确定的唯一的整数
luINT maxBaseClass;//基类数目
luVOID *BaseClass; //基类,是一些以#开头的标识符(字符串)确定的唯一的整数
luINT maxDMember; //数据成员数目
luINT maxMember; //成员数目
luVOID *Member; //成员(递增排列),是一些以#开头的标识符(字符串)确定的唯一的整数
char *attrMember; //成员属性。0:私有数据成员,1:公有数据成员,2:私有成员函数句柄,3:公有成员函数句柄
luVOID *indexMember;//数据成员序号(递增排列),或者成员函数句柄。仅对私有数据成员和公有数据成员进行编号,由该序号决定SClassObj的数据成员地址。
bool bFind; //用于发现循环继承
};
struct SClassObj{ //类对象
luVOID me; //类名字,是一个以#开头的标识符(字符串)确定的唯一的整数
SClassObj *ahead; //派生类(父类),使用前需要验证其有效性
luINT maxBaseClass;//基类数目
LuData *BaseClass; //基类
luINT maxDMember; //数据成员数目
LuData *DMember; //数据成员
};
查看文件LuSystem32.cpp,会发现定义了全局变量keyClass用以标识类定义,该变量的值作为一个键被LockKey加锁(从其初始值keyClass=-123116开始加锁,不成功时keyClass--,直至加锁成功),加锁成功后,键keyClass就只能存储类定义。函数LockKey同时指明了销毁类定义的函数是DelClass;类定义的运算符重载函数是OpLockClass。另外,文件LuSystem32.cpp中还定义了标识对象keyClass的字符串"class",该字符串被注册为Lu整数常量,在Lu源代码中可用new(sys::class,... ...)申请该对象。
在文件LuSystem32.cpp中还定义了全局变量keyClassObj用以标识类对象,该变量的值作为一个键被LockKey加锁(从其初始值keyClassObj=-123117开始加锁,不成功时keyClassObj--,直至加锁成功),加锁成功后,键keyClassObj就只能存储类对象。函数LockKey同时指明了销毁类对象的函数是DelClassObj;类对象的运算符重载函数是OpLockClassObj。另外,文件LuSystem32.cpp中还定义了标识对象keyClassObj的字符串"obj",该字符串被注册为Lu整数常量,在Lu源代码中可用new(sys::obj,... ...)申请该对象。
在Lu脚本中,p=class{... ...}创建一个类,根据返回的类句柄p用函数obj(p)创建类对象。class对应Class.cpp中的C++函数lu_NewClass;obj对应Class.cpp中的C++函数lu_NewClassObj。
在理解结构和字典的基础上,不难理解Class.cpp中定义的函数DelClass、SignKeyClass、OpLockClass、DelClassObj、SignKeyClassObj、OpLockClassObj,类定义重载函数new(lu_NewClass)、o(lu_oClass),以及类对象重载函数copy(lu_copyClassObj)、new(lu_NewClassObj)、oset(lu_osetClassObj)、oget(lu_ogetClassObj)、o(lu_oClassObj)等等。向Lu系统注册了函数除了sys::class、sys::obj外,还有sys::class_handle(对应C++函数lu_class_handle)、sys::obj_oset(对应C++函数lu_osetClassObj)和sys::obj_oget(对应C++函数lu_ogetClassObj)。
为了便于由类对象获得类的成员,文件Class.cpp中定义了函数GetClassMember,该函数使用缓冲池SClassBuf以快速定位类成员,同时实现了类成员的广度优先定位。最后,不难发现,还有两个函数FindClass和FreeClassObj;FindClass是在函数lu_NewClass中使用的,用于查找类是否循环定义及未定义;FreeClassObj是在函数lu_NewClassObj中使用的,用于释放一个类对象。
在扩展库LuSystem中测试了类的效率。
6 其他
你可能注意到了,我的联系方式就在下面,如有不明之处或有什么建议,可随时与我进行联系。
版权所有 Lu程序设计 2002-2013,保留所有权利
E-mail: forcal@sina.com QQ:630715621
最近更新: 2014年01月19日