Menu
CoddyTech

回顾:秘密盒子

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

challenge icon

挑战

简单

让我们构建一个 Box 模块,展示完整的封装。你的箱子有三个隐藏尺寸:宽度、高度和深度,只能通过你提供的函数访问。这就是完整的不透明指针模式!

你将创建三个文件:

  • box.h:公共接口。只使用前向声明来声明不透明的 Box 类型,隐藏结构体的定义。声明以下函数:
    • create_box:接收三个整数(宽度、高度、深度),并返回一个指向 Box 的指针
    • destroy_box:释放已分配的内存
    • get_volume:接收一个 const Box *,并返回体积(宽度 × 高度 × 深度)
    • set_dimensions:接收一个指向 Box 的指针和三个新的尺寸值,并返回 int(成功时为 1,如果任一尺寸小于或等于零,则为 0)
    使用符号 BOX_H 设置包含保护。
  • box.c:定义实际的 struct Box,其中包含三个隐藏成员:int width、int height 和 int depth。实现全部四个函数。构造函数应分配并初始化箱子。set_dimensions 函数必须先验证三个值是否都为正数(大于零),再应用更改。如果任一值未通过验证,则拒绝整个更新并返回 0。
  • main.c:通过创建一个 Box、检查其体积、尝试更改尺寸(包括有效和无效的值),并正确清理资源,来展示封装后的 Box。

你将收到 5 个输入:初始宽度、初始高度、初始深度,然后是用于尝试设置的三个新尺寸(其中可能包含无效值)。

在主文件中,使用初始尺寸创建一个 Box 并输出其体积。然后尝试设置新尺寸:输出更新是否成功以及更新后的体积。最后,释放 Box 并确认已完成清理。

按以下格式输出:

Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed

例如,输入 2、3、4、5、5、5 时,输出为:

Volume: 24
Set: 1
Volume: 125
Destroyed

输入 2、3、4、-1、5、5 时,输出为:

Volume: 24
Set: 0
Volume: 24
Destroyed

注意,set_dimensions 中的验证可以保护你的箱子免于进入无效状态:由于尺寸完全隐藏在接口之后,外部代码无法绕过你的规则。

亲手试试

#include <stdio.h>
#include "box.h"

int main() {
    // 读取初始尺寸
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // 读取要尝试设置的新尺寸
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: 用初始尺寸创建一个 Box
    
    
    // TODO: 按格式 "Volume: {volume}" 输出初始体积
    
    
    // TODO: 尝试设置新尺寸,并保存结果
    
    
    // TODO: 按格式 "Set: {0 or 1}" 输出设置是否成功
    
    
    // TODO: 按格式 "Volume: {volume}" 输出最终体积
    
    
    // TODO: 销毁盒子,并输出 "Destroyed"
    
    
    return 0;
}

面向对象编程中的所有课

自己练习: C 在线编译器