问答题[说明]
在一个简化的绘图程序中,支持的图形种类有点(point)和圆(circle),在设计过程中采用面向对象思想,认为所有的点和圆都是一种图形(shape),并定义了类型shape_t、point_t和circle_t分别表示基本图形、点和圆,并且点和圆具有基本图形的所有特征。
[C程序]
typedef enum { point, circle } shape_type; /* 程序中的两种图形:点和圆 */
typedef struct { /* 基本的图形类型 */
shape type type; /* 图形种类标识:点或者圆 */
void (*destroy) (); /* 销毁图形操作的函数指针 */
void (*draw)(); /* 绘制图形操作的函数指针 */
} shape_t;
typedef struct { shape_t common; int x; int y; } point_t;
/* 定义点类型,x、y为点坐标 */
void destroyPoint (point_t* this) { free(this); printf ("Point
destoryed!\n");) /* 销毁点对象 */
void drawPoint (point_t* this) { printf("P(%d, %d)", this→x, this→y);)
/* 绘制点对象 */
shape_t* createPoint(va_list* ap) /* 创建点对象,并设置其属性 */
{
point_t* p point;
if ((p_point=(point_t*) malloc (sizeof(point_t)))==NULL) return NULL;
p_point→common. type = point;
p_point→common. destroy = destroyPoint;
p_point→common. draw=drawPoint;
p_point→x = va_arg (*ap, int); /* 设置点的横坐标 */
p_point→y = va_arg(*ap, int); /* 设置点的纵坐标 */
return (shape_t*)p_point; /* 返回点对象指针 */
}
tyPedef struct /* 定义圆类型 */
{
shape_t common;
point_t *center; /* 圆心点 */
int radius; /* 圆半径 */
} circle_t;
void destroyCircle(circle_t* this) {
free (______); free(this); printf("Circle destoryed!\n");
}
void drawCircle (circle_t* this)
{
printf ("C(");
______.draw( this→center); /* 绘制圆心*/
printf (", %d)", this→radius);
}
shape_t* createCircle(va list* ap) /* 创建一个圆,并设置其属性 */
{
circle_t* p_circle;
if ((p_circle=(circle_t*)malloc(sizeof(circle_t)))==NULL)return NULL;
p_circle→common. type=circle; p_circle→common. destroy=destroyCircle;
p_circle→common. draw=drawCircle;
______ =createPoint(ap); /* 设置圆心 */
p_circle→radius=va arg(*ap, int); /* 设置圆半径 */
return p_circle;
}
shape t* createShape(shape_type st, …) /* 创建某一种具体的图形 */
{
va_list ap; /* 可变参数列表 */
shape_t* P_shape = NULL;
______ (ap, st);
if ( st == point) p_shape=createPoint( &ap); /* 创建点对象 */
if ( st == circle) p_shape=createCircle(&ap); /* 创建圆对象 */
va_end(ap);
return p-shape;
}
int main()
{
int i; /* 循环控制变量,用于循环计数 */
shape t* shapes[2]; /* 图形指针数组,存储图形的地址 */
shape_s[0] = createShape ( point, 2, 3); /* 横坐标为2,纵坐标为3 */
shapes[1] = createShape( circle, 20, 40, 10);
/* 圆心坐标(20, 40), 半径为10 */
for (i=0; i<2; i++) { shapes[i]→draw(shapes[i]); printf("\n"); }
/* 绘制数组中图形 */
for( i=1; i>=0; i--) shapes[i]→destroy(shapes[i]);
/* 销毁数组中图形 */
return 0;
}
运行结果如下:
p(2, 3)
______
Circle destoryed!
Point destoryed!