August 2021
Intermediate to advanced
450 pages
9h 36m
Chinese
为一个给定类型和指定的输入格式定义输入运算符<<,关键在于错误处理。这可能会是很棘手的事情。
下面是为9.8节中Date类型定义的一个简单的输入运算符,它要求的输入格式与上一节定义的>>的输出格式相同:
>>运算符读入形如“(2004,8,20)”的数据项,并尝试用这三个整数创建一个Date对象。和前面提到的一样,这里的输入处理要比输出处理难得多。输入比输出更容易出错,实际应用中看也确实如此。
如果未发现“(整数,整数,整数)”格式的输入,>>运算符会令流进入一个非正常状态(fail、eof或bad),并且不会改变目标Date对象的值。成员函数clear()用来设置流的状态。显然,ios_base::failbit将使流进入fail()状态。理想的目标是在输入故障的情况下保持目标Date对象不变,而且这会使代码更干净。对于一个opeartor>>()来说,理想目标是不读取或丢弃任何它未用到的字符,但这太困难了:因为在捕获到一个格式错误之前就已经读入了大量字符。例如,对于输入“(2004,8,30}”,只有当读到最后的“}”时,我们才能判断遇到了一个格式错误,而一般来说,指望退回这么多字符是不可行的。唯一肯定可以保证的是用unget()退回一个字符。如果operator>>()读入一个不合法的Date,如“(2004,8,32)”,Date的构造函数会抛出一个异常,这会使我们跳出operator>>()。