《C++面向对象高效编程(第2版)》——第2章 什么是数据抽象

简介:

第2章 什么是数据抽象
C++面向对象高效编程(第2版)
面向对象编程的一项基本任务是创建带有适当功能的类,并隐藏不必要的细节(即抽象数据)。下面,我们将用一个现实生活中的例子来解释数据抽象的概念。

绝大多数人都见过影碟播放机(laser disc player)(或LD播放机)。现在,提出一个简单的问题:设计一个影碟播放机,要求易于使用和修改,可后续添加更多有用的功能。

注意:
如果难以理解影碟播放机,可以用CD播放机代替LD播放机,其设计原理类似。实际上,影碟播放机的功能是CD播放机功能的超集。
我们需要解决的问题是:

(1)面板上应该提供哪些控件?

(2)为了连接到不同的设备(如扩音器、电视机或计算机),播放机应使用何种输入、输出装置?

(3)遥控器上应该有多少个按钮?

播放机应该能够:

根据用户要求,播放影碟;
向前和向后查找特定的节(如果是CD播放机,则查找特定的音轨);
允许用户插入和弹出影碟;
根据用户要求,启动和关闭播放机;
当播放机播放影碟时,用户可随时要求暂停;
根据用户要求,完全停止播放。
下面初步分析一下,在面板上应提供的用户控件(开关或按钮)(见图2-1)。

先来分析其中一个控件的功能:

PLAY:当我们按下PLAY按钮时,自然希望影碟播放机开始启动,并在它所连接的电视屏幕上显示图像。但是,在其他情况下按下PLAY按钮,结果是否会不同?

(a)只有在播放机已接通电源,且POWER开关为ON的情况下,PLAY按钮才会响应。否则,按下PLAY按钮不会响应。

(b)如果播放机内无影碟,则PLAY按钮不会响应。

(c)如果满足(a)和(b),则播放机内的激光束被激活,机械驱动系统带动马达开始转动影碟。

(d)播放机内的电子元件读取影碟上的编码信息,将其转换为视频信号(在多项信号处理操作后),并将视频信号传输给电视机显示图像。CD播放机和LD播放机对碟片的音频信息处理方式类似。
image

图2-1

(e)如果加载的影碟格式不正确(例如,如果在PAL播放机中放入了NTSC碟片)1,播放机的显示面板(或播放机连接的电视机屏幕)上会显示错误的消息。

(f)如果满足以上所有前提条件,则给出一个可视或可听(或兼而有之)的指示,表明播放机正在播放。

从这些简化的步骤中可以看出,只是按下PLAY按钮就会启动播放机内的许多操作。但是,对于使用播放机的用户而言2,她只对屏幕上出现的图像和伴随的音频信息感兴趣,甚至不会意识到播放机内有一个激光束!更不会注意到影碟的旋转或激光束的活动。当她按下PLAY按钮后,希望在电视机屏幕上看见清晰的图像并听见悦耳的声音。

作为LD播放机的设计人员,能从这些信息中获得什么?

在用户看来,LD播放机是一个魔术盒。用户插入影碟,按下PLAY按钮,它就能让与其连通的电视机屏幕上出现画面。这是LD播放机公认的性质(见图2-2)。

我们的设计必须从客户角度出发,不应让内部的细节打扰终端用户的使用。在电视出现图像之前,我们还需要考虑许多其他的事情。

我们已经设计好LD播放机,上面布满许多小按钮,其中一个就是PLAY键。装入影碟后按下PLAY按钮,屏幕上便会出现图像。无论你相信与否,我们已经抽象了数据部分(即我们已经完成了数据抽象)。

image

图2-2

数据抽象(data abstraction)在忽略类对象间存在差异的同时,展现了对用户而言最重要的特性。的确,抽象应该对终端用户隐藏无关紧要的细节,避免暴露有可能分散用户注意力或与使用环境毫不相干的细节。

分析LD播放机的设计

(1)我们不会让激光束、马达等部件暴露出来,也不会让用户对它们一无所知。我们会提供可视或可听(或兼而有之)的指示,显示播放机的内部工作状态。

(2)用户只需按下PLAY按钮,即可欣赏影碟中记录的图像,不必亲自开启马达、接通激光束装置电源、将其对焦在影碟上等。完全没必要让普通用户这么做。有些操作相当危险,假如要求用户手动操作激光束会怎样?制造商很快就会被法律诉讼淹没。(警告:在无任何保护的情况下,暴露在激光束下非常危险。)

(3)如果用户在未装入碟片的情况下,按下PLAY按钮,播放机既不会开启激光束,也不会启动马达。我们的设计应该能智能检测此信息。实际上,播放机随时都记录下自身的状态,并根据相应的信息做出响应。

(4)如果设计人员将LD播放机的各个零部件拆分,放在桌上,告诉用户这就是LD播放机,用户肯定会认为设计人员的精神有问题。设计,或者说抽象,就是把各个大小不一、功能各异的零部件组合起来,在它们之间建立适当的通信机制。进一步而言,设计为用户提供一个明晰的接口,将组成LD播放机的所有部件(即实现)隐藏,只显示用户操作播放机所需的控件。

相关文章
|
13天前
|
存储 监控 算法
基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
36 1
|
20天前
|
存储 C++
UE5 C++:自定义Http节点获取Header数据
综上,通过为UE5创建一个自定义HTTP请求类并覆盖GetResult方法,就能成功地从HTTP响应的Header数据中提取信息。在项目中使用自定义类,不仅可以方便地访问响应头数据,也可随时使用这些信息。希望这种方法可以为你的开发过程带来便利和效益。
76 35
|
3月前
|
算法 Serverless 数据处理
从集思录可转债数据探秘:Python与C++实现的移动平均算法应用
本文探讨了如何利用移动平均算法分析集思录提供的可转债数据,帮助投资者把握价格趋势。通过Python和C++两种编程语言实现简单移动平均(SMA),展示了数据处理的具体方法。Python代码借助`pandas`库轻松计算5日SMA,而C++代码则通过高效的数据处理展示了SMA的计算过程。集思录平台提供了详尽且及时的可转债数据,助力投资者结合算法与社区讨论,做出更明智的投资决策。掌握这些工具和技术,有助于在复杂多变的金融市场中挖掘更多价值。
96 12
|
3月前
|
存储 监控 算法
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
在数字化办公时代,公司监控上网软件成为企业管理网络资源和保障信息安全的关键工具。本文深入剖析C++中的链表数据结构及其在该软件中的应用。链表通过节点存储网络访问记录,具备高效插入、删除操作及节省内存的优势,助力企业实时追踪员工上网行为,提升运营效率并降低安全风险。示例代码展示了如何用C++实现链表记录上网行为,并模拟发送至服务器。链表为公司监控上网软件提供了灵活高效的数据管理方式,但实际开发还需考虑安全性、隐私保护等多方面因素。
52 0
公司监控上网软件架构:基于 C++ 链表算法的数据关联机制探讨
|
4月前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
127 19
|
4月前
|
存储 编译器 数据安全/隐私保护
【C++面向对象——类与对象】CPU类(头歌实践教学平台习题)【合集】
声明一个CPU类,包含等级(rank)、频率(frequency)、电压(voltage)等属性,以及两个公有成员函数run、stop。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。​ 相关知识 类的声明和使用。 类的声明和对象的声明。 构造函数和析构函数的执行。 一、类的声明和使用 1.类的声明基础 在C++中,类是创建对象的蓝图。类的声明定义了类的成员,包括数据成员(变量)和成员函数(方法)。一个简单的类声明示例如下: classMyClass{ public: int
138 13
|
4月前
|
编译器 数据安全/隐私保护 C++
【C++面向对象——继承与派生】派生类的应用(头歌实践教学平台习题)【合集】
本实验旨在学习类的继承关系、不同继承方式下的访问控制及利用虚基类解决二义性问题。主要内容包括: 1. **类的继承关系基础概念**:介绍继承的定义及声明派生类的语法。 2. **不同继承方式下对基类成员的访问控制**:详细说明`public`、`private`和`protected`继承方式对基类成员的访问权限影响。 3. **利用虚基类解决二义性问题**:解释多继承中可能出现的二义性及其解决方案——虚基类。 实验任务要求从`people`类派生出`student`、`teacher`、`graduate`和`TA`类,添加特定属性并测试这些类的功能。最终通过创建教师和助教实例,验证代码
104 5
|
4月前
|
存储 C++
【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】
本任务要求使用C++读取二进制文件并在每行前添加行号后输出到控制台。主要内容包括: 1. **任务描述**:用二进制方式打开指定文件,为每一行添加行号并输出。 2. **相关知识**: - 流类库中常用的类及其成员函数(如`iostream`、`fstream`等)。 - 标准输入输出及格式控制(如`cin`、`cout`和`iomanip`中的格式化函数)。 - 文件的应用方法(文本文件和二进制文件的读写操作)。 3. **编程要求**:编写程序,通过命令行参数传递文件名,使用`getline`读取数据并用`cout`输出带行号的内容。 4. **实验步骤**:参考实验指
138 5
|
4月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
82 5
|
4月前
|
Serverless 编译器 C++
【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
本任务要求设计一个矩形类、圆形类和图形基类,计算并输出相应图形面积。相关知识点包括纯虚函数和抽象类的使用。 **目录:** - 任务描述 - 相关知识 - 纯虚函数 - 特点 - 使用场景 - 作用 - 注意事项 - 相关概念对比 - 抽象类的使用 - 定义与概念 - 使用场景 - 编程要求 - 测试说明 - 通关代码 - 测试结果 **任务概述:** 1. **图形基类(Shape)**:包含纯虚函数 `void PrintArea()`。 2. **矩形类(Rectangle)**:继承 Shape 类,重写 `Print
88 4

热门文章

最新文章