Menu
CoddyTech

圆形实现

本课属于 Coddy C 学习旅程的“面向对象编程”单元。第 45 课,共 61 课。

challenge icon

挑战

简单

我们来继续构建 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 在线编译器