JCOOP入门指南[01]
JCOOP入门指南[03]

JCOOP入门指南[02]

pingf posted @ Thu, 08 Jul 2010 12:54:01 -1100 in C语言 with tags 创作 , 3436 readers

上一篇中用JCOOP[sourceforge.net/projects/jcoop]设计了一个最最简单的Baby类,但是如果都像这样做的话一旦类的规模增大,

每声明一个实例,有些时候就要额外的占用一定的空间[比如类方法使用的指针],

为了节约资源,在JCOOP中一个类其实包含了两部分,一部分存储每个实例的属性成员,

另一部分存储公共的变量,可以是共享变量也可以是公用的方法[这类似与C++中的虚表]

而其声明方式类似下面这样,

CLASS(A)

        ......//普通成员

        SHARE(A)

                ......//方法或共享成员

END_CLASS

而每个类的私有部分和公有部分通过一个名为share的指针(如果声明了公有部分则存在于私有部分,否则不存在)

指向公有部分.

类似的,类的构造和析构也有相应的宏CTOR...CTORS...END_CTORDTOR...DTORS...END_DTOR来声明.

具体见下面的代码,

 

#include <stdio.h>                                                                                                     
#include "./include/jc_oop.h"


CLASS(Baby)
	unsigned int age; //表示年龄的成员
	SHARE(Baby)
		METHOD(unsigned int,getAge)(void *);
		METHOD(void,setAge)(void *,unsigned int);
		METHOD(void,cry)(void *); //两个void分别对应返回值和参数
END_CLASS

static void Jcry(void *z){
	printf("baby is crying...\n");
}

static unsigned int JgetAge(void *z){
	ZS(Baby);
	return this->age;
}

static void JsetAge(void *z,unsigned int age){
	ZS(Baby);
	this->age=age;
}


CTOR(Baby) //构造函式
	printf("Baby constructor called ... \n");
	ASSIGN(age,1); //赋值
	CTORS(Baby)
		printf("Baby share part constructor called ... \n");
		CONNECT(cry,Jcry); //链接到指定的函式
		CONNECT(getAge,JgetAge);
		CONNECT(setAge,JsetAge);
END_CTOR

DTOR(Baby) //析构函式
	printf("Baby destructor called ... \n");
	UNASSIGN(age); //置零
	DTORS(Baby)
		printf("Baby share part destructor called ... \n");
		DISCONNECT(getAge);
		DISCONNECT(setAge);
		DISCONNECT(cry); //断开链接
END_DTOR

int main(){
	NEW_BUNDLE(Baby,baby,bs);
	printf("the baby's age is %d\n",bs->getAge(baby));    
	bs->cry(baby);
	bs->setAge(baby,3);
	printf("the baby's age is %d\n",bs->getAge(baby));    
	DEL(Baby,baby);
	DELS(Baby,bs);
	return 0;
}

这里要特别声明的是如果用ZS宏,第一个参数的声明应为void *z,这样才会正确的转换成相应的"this指针"

编译正确后,会输出如下,

Baby share part constructor called ... 
Baby constructor called ... 
the baby's age is 1
baby is crying...
the baby's age is 3
Baby destructor called ... 
Baby share part destructor called ... 

另外顺带要说一下NEW_BUNDLE这个宏,其相当于NEWS和NEW这两个宏的组合,第一次声明某个实例时使用该宏会更加简洁.

和前面讲到的CTORS和DTORS一样,那个末尾的S表示SHARE,也就是公有部分.

而程序中我们实际使用的是两个类型分别BabyShareBaby指针,其分别指向了两个在堆上创建的实例.

当然如果你正确的使用NEW和DEL等宏,那么一般不用过多关注堆上类所用内存的分配.


Login *


loading captcha image...
(type the code from the image)
or Ctrl+Enter