接下来,我们看一下对SelfTest()函数的更改,如代码清单19-6所示。
代码清单19-6 aController的SelfTest()函数
第3行与结构化版本明显不同:SelfTest()函数实例化anAc- cumulator并执行所有测试,而不是只测试myAccumulator。这样可以避免破坏当前计算器的内部状态,并且可以简化测试。TestOK()函数被修改成通过参数传递对象,其调用如第9行~第14行所示。
当执行完SelfTest()时,SelfTest()的TestAccumulator会被销毁。这对aController的myAccumulator没有任何影响。
第12行用aRequest构造函数创建临时对象,作为实参传给TestOK()用来在测试中使用。
接下来,我们看一下由main()传给aController构造函数引用的用法,如代码清单19-7所示。
代码清单19-7 aController的DisplayTape()函数
第7行,myExternalInterface的函数DisplayRequest()用来负责显示调用Operator()和Operand()的结果。
最后,Operate()函数实现了真正的控制计算器的代码,如代码清单19-8所示。
代码清单19-8 aController的Operate()函数
第3行从myExternalInterface获得aRequest。只要Operator()不是aRequest::stop,第5行就一直循环。
第9行展示了switch语句可以在aRequest类中嵌套使用enum。
第11行、第16行和第21行基于第9行测试Request.Operator()的结果分别处理不同的情况。
第28行和第29行使用myTape和myAccumulator执行计算器核心的函数。
为了不让循环被打断,第35行和第39行捕获了所有的异常。
【责任编辑:
董书 TEL:(010)68476606】