- 内容提要
- 前言
- 第 1 章 预备知识
- 第 2 章 开始学习 C++
- 第 3 章 处理数据
- 第 4 章 复合类型
- 第 5 章 循环和关系表达式
- 第 6 章 分支语句和逻辑运算符
- 第 7 章 函数——C++的编程模块
- 第 8 章 函数探幽
- 第 9 章 内存模型和名称空间
- 第 10 章 对象和类
- 第 11 章 使用类
- 第 12 章 类和动态内存分配
- 第 13 章 类继承
- 第 14 章 C++中的代码重用
- 第 15 章 友元、异常和其他
- 第 16 章 string 类和标准模板库
- 第 17 章 输入、输出和文件
- 第 18 章 探讨 C++新标准
- 附录 A 计数系统
- 附录 B C++保留字
- 附录 C ASCII 字符集
- 附录 D 运算符优先级
- 附录 E 其他运算符
- 附录 F 模板类 string
- 附录 G 标准模板库方法和函数
- 附录 H 精选读物和网上资源
- 附录 I 转换为 ISO 标准 C++
- 附录 J 复习题答案
14.7 编程练习
1.Wine 类有一个 string 类对象成员(参见第 4 章)和一个 Pair 对象(参见本章);其中前者用于存储葡萄酒的名称,而后者有 2 个 valarray<int>对象(参见本章),这两个 valarray<int>对象分别保存了葡萄酒的酿造年份和该年生产的瓶数。例如,Pair 的第 1 个 valarray<int>对象可能为 1988、1992 和 1996 年,第 2 个 valarray<int>对象可能为 24、48 和 144 瓶。Wine 最好有 1 个 int 成员用于存储年数。另外,一些 typedef 可能有助于简化编程工作:
这样,PairArray 表示的是类型 Pair<std::valarray<int>, std::valarray<int> >。使用包含来实现 Wine 类,并用一个简单的程序对其进行测试。Wine 类应该有一个默认构造函数以及如下构造函数:
Wine 类应该有一个 GetBottles( ) 方法,它根据 Wine 对象能够存储几种年份(y),提示用户输入年份和瓶数。方法 Label( ) 返回一个指向葡萄酒名称的引用。sum( ) 方法返回 Pair 对象中第二个 valarray<int>对象中的瓶数总和。
测试程序应提示用户输入葡萄酒名称、元素个数以及每个元素存储的年份和瓶数等信息。程序将使用这些数据来构造一个 Wine 对象,然后显示对象中保存的信息。
下面是一个简单的测试程序:
下面是该程序的运行情况:
2.采用私有继承而不是包含来完成编程练习 1。同样,一些 typedef 可能会有所帮助,另外,您可能还需要考虑诸如下面这样的语句的含义:
您设计的类应该可以使用编程练习 1 中的测试程序进行测试。
3.定义一个 QueueTp 模板。然后在一个类似于程序清单 14.12 的程序中创建一个指向 Worker 的指针队列(参见程序清单 14.10 中的定义),并使用该队列来测试它。
4.Person 类保存人的名和姓。除构造函数外,它还有 Show( ) 方法,用于显示名和姓。Gunslinger 类以 Person 类为虚基类派生而来,它包含一个 Draw( ) 成员,该方法返回一个 double 值,表示枪手的拔枪时间。这个类还包含一个 int 成员,表示枪手枪上的刻痕数。最后,这个类还包含一个 Show( ) 函数,用于显示所有这些信息。
PokerPlayer 类以 Person 类为虚基类派生而来。它包含一个 Draw( ) 成员,该函数返回一个 1~52 的随机数,用于表示扑克牌的值(也可以定义一个 Card 类,其中包含花色和面值成员,然后让 Draw( ) 返回一个 Card 对象)。PokerPlayer 类使用 Person 类的 show( ) 函数。BadDude( ) 类从 Gunslinger 和 PokerPlayer 类公有派生而来。它包含 Gdraw( ) 成员(返回坏蛋拔枪的时间)和 Cdraw( ) 成员(返回下一张扑克牌),另外还有一个合适的 Show( ) 函数。请定义这些类和方法以及其他必要的方法(如用于设置对象值的方法),并使用一个类似于程序清单 14.12 的简单程序对它们进行测试。
5.下面是一些类声明:
注意,该类层次结构使用了带虚基类的 MI,所以要牢记这种情况下用于构造函数初始化列表的特殊规则。还需要注意的是,有些方法被声明为保护的。这可以简化一些 highfink 方法的代码(例如,如果 highfink::ShowAll( ) 只是调用 fink::ShowAll( ) 和 manager::ShwAll( ),则它将调用 abstr_emp::ShowAll( ) 两次)。请提供类方法的实现,并在一个程序中对这些类进行测试。下面是一个小型测试程序:
为什么没有定义赋值运算符?
为什么要将 ShowAll( ) 和 SetAll( ) 定义为虚的?
为什么要将 abstr_emp 定义为虚基类?
为什么 highfink 类没有数据部分?
为什么只需要一个 operator<<( ) 版本?
如果使用下面的代码替换程序的结尾部分,将会发生什么情况?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论