本节书摘来自异步社区出版社《c++编程风格(修订版)》一书中的第3章,第3.1节,作者:【美】tom cargill,更多章节内容可以访问云栖社区“异步社区”公众号查看。
c++编程风格(修订版)
在程序清单3.1的程序中定义了一个用于处理字符堆栈的charstack类,以及用于处理整数堆栈的intstack类。我们将对这两个类进行分析和评价,并且判断这些类中的抽象是不是正确的、接口是否起到了相应的作用,以及类之间的继承关系是不是合适的。
有些读者在看到charstack和intstack时的第一反应可能是,这些类应该使用参数化类型来编写,这也是ansi(参见ellis和stroustrup的著作,第341页)建议的方法。在这里我们暂时先不考虑这种做法,而是把注意力集中于对本章给出的代码进行分析,理由主要有两个:首先,在考虑使用其他方法来改写这个程序之前,我们要重点了解这个程序在使用c++的核心特性时存在什么样的问题。在这个程序中,问题能够更容易地暴露出来,而使用参数化类型则达不到这个目的;其次,在编写本书时,参数化类型并没有得到广泛的应用,它们在某些情况下并不能很好地整合到c++中。而且,如果我们还没有在如何使用参数化类型上积累足够的编程经验,那么对于参数化类型编程风格的讨论就显得为时过早。在本章的结尾部分,我们给出了使用模板来改写的程序。
程序清单3.1 最初的stack、charstack和intstack
在上述程序中,核心的设计思想是:由于charstack和intstack都是堆栈,因此它们有一个共同的基类stack。继承的层次结构如图3.1所示。
图像说明文字
图3.1 继承的层次结构
只有在仔细分析了这个程序之后,我们才会发现程序中的继承是不必要的,并且容易使人产生误解,因此应该去掉。事实上,在本程序中使用的公有继承将破坏堆栈的封装性。