diff --git a/main.c b/main.c index 71d81af..4baddfb 100644 --- a/main.c +++ b/main.c @@ -13,11 +13,11 @@ struct _virtual_table { - VIRTUAL void (*area)(void *self, void *parent); + VIRTUAL double (*area)(void *self, void *parent); VIRTUAL void (*draw)(void *self, void *parent); }; -void virtual_area(void *self, void *parent) +double virtual_area(void *self, void *parent) { ASSERT_CALL_VIRTUAL_METHOD(); } @@ -44,10 +44,12 @@ struct _shape struct _virtual_table vtb; }; -void shape_area(void *self, void *parent) +double shape_area(void *self, void *parent) { + double area = 0; struct _shape *pthis = (struct _shape *)parent; - pthis->vtb.area(self, NULL); + area = pthis->vtb.area(self, NULL); + return area; } void shape_draw(void *self, void *parent) @@ -56,7 +58,7 @@ void shape_draw(void *self, void *parent) pthis->vtb.draw(self, NULL); } -PRIVATE void _shape_area(void *self, void *parent) +PRIVATE double _shape_area(void *self, void *parent) { ASSERT_CALL_VIRTUAL_METHOD(); } @@ -74,7 +76,7 @@ struct _shape *shape_new(void) return NULL; } static struct _virtual_table vtb = { - .area = (void (*)(void *self, void *parent))_shape_area, + .area = (double (*)(void *self, void *parent))_shape_area, .draw = (void (*)(void *self, void *parent))_shape_draw }; shape->vtb = vtb; @@ -108,9 +110,11 @@ struct _rect // void (*draw)(void *self); }; -void rect_area(struct _rect *self, void *parent) +double rect_area(struct _rect *self, void *parent) { - printf("rect area = %0.2f\n", self->width * self->height); + double area = self->width * self->height; + printf("rect area = %0.2f\n", area); + return area; } void rect_draw(struct _rect *self, void *parent) @@ -129,7 +133,7 @@ struct _rect *rect_new(double width, double height) rect->height = height; static struct _virtual_table vtb = { - .area = (void (*)(void *self, void *parent))rect_area, + .area = (double (*)(void *self, void *parent))rect_area, .draw = (void (*)(void *self, void *parent))rect_draw }; @@ -155,9 +159,11 @@ struct _circle // void (*draw)(void *self); }; -void circle_area(struct _circle *self, void *parent) +double circle_area(struct _circle *self, void *parent) { - printf("circle area = %0.2f\n", 3.14 * self->radius * self->radius); + double area = 3.14 * self->radius * self->radius; + printf("circle area = %0.2f\n", area); + return area; } void circle_draw(struct _circle *self, void *parent) { @@ -174,7 +180,7 @@ struct _circle *circle_new(double radius) circle->radius = radius; static struct _virtual_table vtb = { - .area = (void (*)(void *self, void *parent))circle_area, + .area = (double (*)(void *self, void *parent))circle_area, .draw = (void (*)(void *self, void *parent))circle_draw, }; @@ -183,45 +189,61 @@ struct _circle *circle_new(double radius) return circle; } -#if 0 -struct _cube +struct _copper_cash { - // 继承自 struct _shape - struct _rect; - - // attibute - double length; + struct _shape shape; + struct _rect *rect; + struct _circle *circle; + + double price; }; -void cube_area(struct _cube *self) +double copper_cash_area(struct _copper_cash *self, void *parent) { - printf("cube area = %0.2f\n", self->length * self->length * self->length); + double circle_area = self->circle->shape.vtb.area(self->circle, self->circle); + double rect_area = self->rect->shape.vtb.area(self->rect, self->rect); + double area = circle_area - rect_area; + + printf("copper cash area = %0.2f\n", circle_area - rect_area); + return area; } -void cube_draw(struct _cube *self) +void copper_cash_draw(struct _copper_cash *self, void *parent) { - printf("cube draw\n"); + printf("copper cash draw\n"); } -struct _cube* cube_new(double length) + +struct _copper_cash *copper_cash_new(double width, double height, double radius) { - struct _cube *cube = calloc(1, sizeof(struct _cube)); - if (cube == NULL) + struct _copper_cash *cc = calloc(1, sizeof(struct _copper_cash)); + if (cc == NULL) { return NULL; } - cube->length = length; + + struct _rect *rect = rect_new(width, height); + if(rect == NULL) + { + return NULL; + } + cc->rect = rect; + + struct _circle *circle = circle_new(radius); + if (circle == NULL) + { + return NULL; + } + cc->circle = circle; + cc->price = 100; static struct _virtual_table vtb = { - .area = (void (*)(void *self))cube_area, - .draw = (void (*)(void *self))cube_draw, + .area = (double (*)(void *self, void *parent))copper_cash_area, + .draw = (void (*)(void *self, void *parent))copper_cash_draw, }; - - cube->vtb = vtb; - return cube; + cc->shape.vtb = vtb; + return cc; } -#endif - int main(int argc, char *argv[]) { @@ -233,14 +255,14 @@ int main(int argc, char *argv[]) circle_area(circle, circle); circle_draw(circle, circle); - printf("------------------------------\n"); + printf("----- rect & circle -----\n"); shape_area(rect, &rect->shape); shape_draw(rect, &rect->shape); shape_area(circle, &circle->shape); shape_draw(circle, &circle->shape); - printf("------------------------------\n"); + printf("----- [2] rect & circle -----\n"); struct _rect *rect2 = (struct _rect *)rect_new(2, 3); shape_area(rect2, &rect2->shape); shape_draw(rect2, &rect2->shape); @@ -249,10 +271,15 @@ int main(int argc, char *argv[]) shape_area(circle2, &circle->shape); shape_draw(circle2, &circle->shape); - printf("------------------------------\n"); - struct _shape *shape = shape_new(); - shape_area(shape, shape); - shape_draw(shape, shape); + // printf("----- [2] shape -----\n"); + // struct _shape *shape = shape_new(); + // shape_area(shape, shape); + // shape_draw(shape, shape); + + printf("----- copper_cash -----\n"); + struct _copper_cash *cc = copper_cash_new(2, 2, 4); + shape_area(cc, &cc->shape); + shape_draw(cc, &cc->shape); return 0; }