16.10 练习
部分练习题的答案可以在本书的电子文档“Annotated Solution Guide for Thinking in C++”中找到,只需支付很少的费用就可以从http://www.BruceEckel.com得到这个电子文档。
16-1 实现本章中OShape图的继承层次。
16-2 修改第15章练习1的结果,以便使用TStack2.h中的Stack和iterator替代一个Shape指针的数组。增加针对类层次的析构函数,使得我们可以观察到:在Stack超出范围时Shape对象的销毁。
16-3 修改TPStash.h,使得由inflate()使用的增量值能在特定容器对象的生命期内改变。
16-4 修改TPStash.h,使得由inflate()使用的增量值能自动地调整自身大小,以减少它需要被调用的次数。例如,每次调用它,它都能为下一次调用而加倍这个增量值。通过报告是否inflate()被调用来证明这个功能,并且在main()中编写测试代码。
16-5 对于fibonacci()函数产生的值的类型,模板化fibonacci()函数(使得它能产生long、float等类型的值,而不只产生int型值)。
16-6 使用标准C++库vector作为下层实现,创建一个Set模板类,对于放入这个模板类中的每一种对象,它只接受一个。创建一个嵌套iterator类,它支持本章中的“终止哨兵”思想。
在main()中编写测试代码,并随后代替标准C++库的Set模板以验证其行为是正确的。
16-7 修改AutoCounter.h使得它能在任何类中被用作成员对象,我们希望能跟踪它的创建和销毁。增加一个string成员,用来保存这个类的名称。在我们自己的一个类中测试这个工具。
16-8 创建OwnerStack.h的一个版本,它使用标准C++库vector作为它的下层实现。为此,我们可能需要查寻vector的一些成员函数(或只考虑<vector>头文件)。
16-9 修改ValueStack.h,使得当我们push()更多的对象并且超出空间时它能自动地扩展。改动ValueStackTest.cpp以测试新的功能性。
16-10 重复练习9,但使用标准C++库vector作为ValueStack的内部实现。注意,这种做法容易多了。
16-11 修改ValueStackTest.cpp,使得它在main()中使用标准C++库vector而不使用Stack。注意运行时的行为:当vector创建时它自动创建一系列默认对象吗?
16-12 修改TStack2.h,使得它使用标准C++库vector作为它的下层实现。确信不要改变接口就能让TStack2Test.cpp照常工作。
16-13 使用标准C++库Stack而不使用vector重复练习12(可能需要查寻关于stack的信息,或者搜索<stack>头文件)。
16-14 修改TPStash2.h,使得它使用标准C++库vector作为它的下层实现。确信不要改变接口就能让TPStash2Test.cpp照常工作。
16-15 在IterIntStack.cpp中,修改IntStackIter,给它一个“终止哨兵”构造函数,添加operator==和operator!=。在main()中,使用一个迭代器遍历这个容器的元素,直到我们到达“终止哨兵”。
16-16 使用TStack2.h、TPStash2.h和Shape.h,为Shape*实例化Stack和PStash容器,对它们填充向上类型转换的Shape指针,然后用迭代器遍历每个容器,并为每个对象调用draw()。
16-17 模板化TPStash2Test.cpp中的Int类,使得它存放任意类型的对象(可以改变这个类的名称,使之更确切)。
16-18 模板化来自第12章的IostreamOperatorOverloading.cpp中的IntArray类,模型化它包含的对象的类型和内部数组的长度。
16-19 将来自第12章的NestedSmartPointer.cpp中的ObjContainer翻译成一个模板。用两个不同的类测试它。
16-20 通过模板化class Stack来修改C15:OStack.h和C15:OStackTest.cpp,使得它自动地从被包含类和从Object多重继承。被产生的Stack应当只接受和生成被包含类型的指针。
16-21 使用vector而不使用Stack重复练习20。
16-22 从vector<void>继承一个类StringVector,并且重新定义push_back()和operator[]成员函数,使得它只接受和生成string(并执行适当的类型转换)。现在,创建一个模板,它将自动地产生一个容器类以便对任何类型的指针做同样的事情。这个技术常常用于减少代码膨胀,防止过多的模板实例化。
16-23 在TPStash2.h中,对PStash:iterator添加和测试operator-,仿照operator+的逻辑。
16-24 在Drawing.cpp中,添加和测试一个函数模板,用来调用erase()成员函数。
16-25 (高级)修改TStack2.h中的Stack类以允许所有权的所有粒度:为每一个链表增加一个标志以表明它是否拥有其指向的对象,并在push()函数和析构函数中支持这一信息。增加用于读取和改变每一个链表所有权的成员函数。
16-26 (高级)修改来自第12章的PointerToMemberOperator.cpp,使得FunctionObject和operator->被模板化,以便与任何返回类型工作(对于operator->,必须用成员模板,这将在第2卷中介绍)。在Dog成员函数中,添加和测试对于零个、一个和两个参数的支持。