用C/C++设计Lu结构、字典、类等高级数据类型(三)

2014-11-24 08:11:15 · 作者: · 浏览: 3
//类定义 private: #a, //私有数据 public: method : #mGetA : @getA, //类公有方法 #mSetA : @setA //类公有方法 }, b=obj[a], //类对象 b.#mSetA=5, //通过类公有方法赋值 o[a, b, "\r\n", b.#mGetA, "\r\n"]; //输出类定义、类对象及类成员的值


结果:

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日