设为首页 加入收藏

TOP

用C实现面向对象(二)
2015-03-19 03:34:48 来源: 作者: 【 】 浏览:294
Tags:实现 面向 对象
st struct Base * const * cp = self;
assert(self && *cp && (*cp)->draw);
(*cp)->draw(self);
}

/**
* 基类Base的内部头文件Base.r,对外隐藏
*/
#ifndef BASE_R
#define BASE_R


#include


struct Base {
size_t size;
void * (*constructor)(void * self, va_list * app); //构造函数
void * (*destroy)(void * self); //析构函数
void (*draw)(const void * self);//作图函数
};


#endif


/**
* Point的头文件Point.h(对外提供接口)
*/
#ifndef POINT_H
#define POINT_H


extern const void * Point; /* new(Point, x, y); */


void move(void * point, int dx, int dy);


struct Point {
const void * base; //继承Base类,基类指针,放在第一个位置,const是防止修改
int x, y; //坐标
};


#define point_x(p)(((const struct Point *)(p)) -> x)
#define point_y(p)(((const struct Point *)(p)) -> y)


#endif


//Point的源文件Point.c
#include
#include Point.h
#include cnew.h
#include Base.h


/**********Point类自己的构造函数***********/
static void * Point_New(void * _self, va_list * app) {
struct Point * self = _self;
self->x = va_arg(*app, int);
self->y = va_arg(*app, int);
printf(Point_New self = %p , self);
return self;
}


/**********Point类自己的析构函数***********/
static void* Point_Delete(void * _self) {
printf(call Point_Delete self =%p , _self);
printf(@@@@@@@@@@@@@@@@@@@@@@@@@@@@ );
return NULL;
}


/**********Point类自己的绘图函数***********/
static void Point_Draw(const void * _self) {
const struct Point * self = _self;
printf(Point_Draw at %d,%d , self->x, self->y);
}


void move(void * _self, int dx, int dy) {
struct Point * self = _self;
printf(call move self =%p , _self);
self->x += dx;
self->y += dy;
}


static const struct Base _Point = { sizeof(struct Point), Point_New, Point_Delete, Point_Draw };
const void * Point = &_Point;


/**
* Circle的头文件Circle.h(对外提供接口)
*/


#ifndef CIRCLE_H
#define CIRCLE_H


#include Point.h


extern const void * Circle; /* new(Circle, x, y, rad) */


struct Circle {
const struct Point pbase; //继承Point类,需放在第一位
int radius;
int (*area)(void *self);// 面积,扩展方法
};


#define circle_area(p) (((const struct Circle *)(p)) -> area(p))


#endif




/**
* Circle的源文件Circle.c
*/
#include
#include Circle.h
#include cnew.h
#include Base.h


/**********Circle类自己的扩展函数***********/
static int Circle_Area(void * _self) {
const struct Circle * self = _self;
printf(call Circle_Area self =%p , _self);
return self->radius * self->radius;
}


/**********Circle类自己的构造函数***********/
static void * Circle_New(void * _self, va_list * app) {
struct Circle * self = ((const struct Base *) Point)->constructor(_self, app);
self->radius = va_arg(*app, int);
self->area = Circle_Area;
printf(call Circle_New self =%p , _self);
return self;
}


/**********Circle类自己的构造函数***********/
static void* Circle_Delete(void * _self) {
printf(call Circle_Delete self =%p , _self);
printf(@@@@@@@@@@@@@@@@@@@@@@@@@@@@ );
return NULL;
}


/**********Circle类自己的绘图函数***********/
static void Circle_Draw(const void * _self) {
const struct Circle * self = _self;
int x = point_x(self);
int y = point_y(self);
printf(Circle_Draw at %d,%d rad %d , x, y, self->radius);
}


static const struct Base _Circle = { sizeof(struct Circle), Circle_New, Circle_Delete, Circle_Draw };
const void * Circle = &_Circle;






/**
* 测试函数
*/


#include Circle.h
#include cnew.h


int oo_main(int argc, char ** argv) {
void * p;
int i;
for (i = 0; i < 2; i++) {
if (i == 0) {
p = cnew(Circle, 1, 2, 3);
circle_area(p);
} else {
p = cnew(Point, 1, 2);
}
draw(p);
move(
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇算法-冒泡排序和快速排序(Object-.. 下一篇C语言实现捞鱼问题

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: