圆形实现
本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 45 课,共 61 课。
挑战
简单我们来继续构建 Shape Drawer 项目,实现 Circle:一种具体图形,它嵌入基础 Shape 结构体,并提供自己的绘制和面积计算逻辑。
基于上一课的内容,你将通过以下文件扩展项目:
shape.h:保留上一课中的基础Shape接口,其中包含DrawFunc和AreaFunc函数指针类型。circle.h:在这里定义Circle结构体。圆会将Shape作为它的第一个成员嵌入其中(这样就可以使用首成员规则进行向上转型),并添加一个double类型的radius字段。声明一个构造函数create_circle,它接收半径,并按值返回一个Circle。circle.c:在这里实现圆形专属的行为:draw_circle:打印Drawing Circle with radius: X.XX(半径显示为小数点后 2 位)area_circle:返回 π × 半径²(π 使用3.14159)create_circle:初始化一个Circle,将嵌入的Shape的函数指针分别指向draw_circle和area_circle,设置半径,然后返回该圆形
main.c:整合所有内容。读取一个半径值作为输入,使用构造函数创建一个圆形,然后通过嵌入的Shape的函数指针调用draw和area。打印面积,保留小数点后 2 位。
程序会接收一个输入:半径值(浮点数)。
输入为 5.0 时的输出示例:
Drawing Circle with radius: 5.00
Area: 78.54输入为 3.5 时的输出示例:
Drawing Circle with radius: 3.50
Area: 38.48关键在于,Circle 将 Shape 作为它的第一个成员,因此你可以通过 circle.base.draw 和 circle.base.area 访问函数指针(也可以为嵌入的成员取其他名称)。调用这些函数时,要传入指向 Shape 成员的指针。记得在所有头文件中使用包含保护。
亲手试试
#include <stdio.h>
#include "shape.h"
#include "circle.h"
int main() {
double radius;
scanf("%lf", &radius);
// TODO: 用 create_circle 创建一个 Circle
// TODO: 通过内嵌的 Shape 的函数指针调用 draw
// TODO: 通过内嵌的 Shape 的函数指针调用 area
// 并保留 2 位小数输出:"Area: %.2f\n"
return 0;
}面向对象编程中的所有课
自己练习: C 在线编译器