shape_area函数访问孙子测试通过

This commit is contained in:
建峰 2024-09-01 15:48:37 +08:00
parent d28aec06ca
commit 5975890154

107
main.c
View File

@ -13,11 +13,11 @@
struct _virtual_table struct _virtual_table
{ {
VIRTUAL void (*area)(void *self, void *parent); VIRTUAL double (*area)(void *self, void *parent);
VIRTUAL void (*draw)(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(); ASSERT_CALL_VIRTUAL_METHOD();
} }
@ -44,10 +44,12 @@ struct _shape
struct _virtual_table vtb; 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; 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) void shape_draw(void *self, void *parent)
@ -56,7 +58,7 @@ void shape_draw(void *self, void *parent)
pthis->vtb.draw(self, NULL); 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(); ASSERT_CALL_VIRTUAL_METHOD();
} }
@ -74,7 +76,7 @@ struct _shape *shape_new(void)
return NULL; return NULL;
} }
static struct _virtual_table vtb = { 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 .draw = (void (*)(void *self, void *parent))_shape_draw
}; };
shape->vtb = vtb; shape->vtb = vtb;
@ -108,9 +110,11 @@ struct _rect
// void (*draw)(void *self); // 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) void rect_draw(struct _rect *self, void *parent)
@ -129,7 +133,7 @@ struct _rect *rect_new(double width, double height)
rect->height = height; rect->height = height;
static struct _virtual_table vtb = { 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 .draw = (void (*)(void *self, void *parent))rect_draw
}; };
@ -155,9 +159,11 @@ struct _circle
// void (*draw)(void *self); // 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) void circle_draw(struct _circle *self, void *parent)
{ {
@ -174,7 +180,7 @@ struct _circle *circle_new(double radius)
circle->radius = radius; circle->radius = radius;
static struct _virtual_table vtb = { 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, .draw = (void (*)(void *self, void *parent))circle_draw,
}; };
@ -183,45 +189,61 @@ struct _circle *circle_new(double radius)
return circle; return circle;
} }
#if 0 struct _copper_cash
struct _cube
{ {
// 继承自 struct _shape struct _shape shape;
struct _rect; struct _rect *rect;
struct _circle *circle;
// attibute
double length; 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)); struct _copper_cash *cc = calloc(1, sizeof(struct _copper_cash));
if (cube == NULL) if (cc == NULL)
{ {
return 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 = { static struct _virtual_table vtb = {
.area = (void (*)(void *self))cube_area, .area = (double (*)(void *self, void *parent))copper_cash_area,
.draw = (void (*)(void *self))cube_draw, .draw = (void (*)(void *self, void *parent))copper_cash_draw,
}; };
cc->shape.vtb = vtb;
cube->vtb = vtb; return cc;
return cube;
} }
#endif
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
@ -233,14 +255,14 @@ int main(int argc, char *argv[])
circle_area(circle, circle); circle_area(circle, circle);
circle_draw(circle, circle); circle_draw(circle, circle);
printf("------------------------------\n"); printf("----- rect & circle -----\n");
shape_area(rect, &rect->shape); shape_area(rect, &rect->shape);
shape_draw(rect, &rect->shape); shape_draw(rect, &rect->shape);
shape_area(circle, &circle->shape); shape_area(circle, &circle->shape);
shape_draw(circle, &circle->shape); shape_draw(circle, &circle->shape);
printf("------------------------------\n"); printf("----- [2] rect & circle -----\n");
struct _rect *rect2 = (struct _rect *)rect_new(2, 3); struct _rect *rect2 = (struct _rect *)rect_new(2, 3);
shape_area(rect2, &rect2->shape); shape_area(rect2, &rect2->shape);
shape_draw(rect2, &rect2->shape); shape_draw(rect2, &rect2->shape);
@ -249,10 +271,15 @@ int main(int argc, char *argv[])
shape_area(circle2, &circle->shape); shape_area(circle2, &circle->shape);
shape_draw(circle2, &circle->shape); shape_draw(circle2, &circle->shape);
printf("------------------------------\n"); // printf("----- [2] shape -----\n");
struct _shape *shape = shape_new(); // struct _shape *shape = shape_new();
shape_area(shape, shape); // shape_area(shape, shape);
shape_draw(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; return 0;
} }