我们用下面的结构来描述一个对象:
typedef struct _ClassType { char* name; /*对象名,唯一*/ int object_size;/*对象大小,创建实列时分配内存要用到*/ int class_size; /*全部虚函数大小,如sizeof(CObjectClass)*/ void* vclass; /*虚函数指针*/ void (*InitClassCallback)(void*); /*给对象的虚函数赋值*/ void (*InitObjectCallback)(void*);/*对象实例化时,给实例成员赋初值,有点类似构造函数*/ struct _ClassType* parent; /*父对象*/ struct _ClassType* next; /*单向链表,指向下一对象*/ }ClassType; #define [MAX_CLASS_NUM 128 static ClassType classes[MAX_CLASS_NUM]; /*对象池*/ static ClassType *used_classes = NULL; static ClassType *free_classes = NULL; |
这里只定义了128个对象,数目可能修改或者改成动态分配。
初始化,全部链接到空闲链表中。
void InitObjectLib(void) { int i; memset(classes, 0, sizeof(ClassType)*MAX_CLASS_NUM); for( i=0;i<MAX_CLASS_NUM-1;i++ ) { classes[i].next = &(classes[i+1]); } free_classes = &(classes[0]); } |
这个函数既是获取对象的虚函数指针,也是注册对象。
这里要注意type为static,一个对象只注册一次,下次获取时直接取type。
RegisterClassType()第一个参数为对象的描述信息,第二个参数为父对象的函数指针,我们来看一下它的定义:
#define TOP_OBJECT_TYPE 0
#define BASE_OBJECT_TYPE GetObjectType()