6.8 单词流
在改进计算器程序之前,我们先给出Token_stream的实现。毕竟,程序在没有获得正确输入之前是不能正确运行的。因此,我们首先实现Token_stream,但并不是想偏离计算器程序这个主题太远,只是首先完成一个尽量小的可用程序。
计算器程序的输入是一个单词序列,如前面的例子(1.5+4)*11中所示(6.3.3节)。我们需要从标准输入cin中读入字符,并且能够向程序提供运行时需要的下一个单词。另外,我们发现计算器程序经常多次读入一个单词,因此应该把它们保存起来便于后续使用。这是最典型也是最基本的功能,当严格从左到右读入1.5+4时,在没有读入‘+’之前,你如何判断浮点数1.5已经完整读入了呢?实际上,在遇到‘+’之前,我们完全有可能是在读入1.55555,而不是1.5的过程中。因此,我们需要一个“流”,当我们需要一个单词时,可以调用get()函数从流中产生一个单词,并且可以利用putback()把单词放回流中。根据C++的语法规则,我们必须先定义Token_stream类型。
你可能注意到了前面Token定义中的public:,那里使用public并没有特别的原因。但对于Token_stream,则必须使用public来限定相应的函数。C++用户自定义类型通常由两部分构成:公有接口(用“public:”标识)和具体实现(用“private:”标识)。这样做主要为了将用户接口(用户方便使用类型所需的)和具体实现(实现类型所需的)分开,希望没有对用户的理解造成困难:
显然,我们经常既扮演用户的角色,又扮演实现者的角色。但是,弄清楚用户使用的公有接口和仅由实现者使用的具体实现之间的区别,对于组织程序代码是非常重要的。公有接口应该只包含用户需要的内容,经常是一组函数。私有实现包括实现公有函数所必须的内容,包括用于处理复杂细节的数据和函数,而这些都是用户不必知道也不应该直接使用的。 ...