初学C++的心得,高手请绕道。同样初学的朋友可以配合《一个面向对象程序范例--沉思录》来看下,一起玩味。
句柄类这东西似乎为C++而生,“C++的一个不小的讽刺是,可以用其进行面向对象编程却不能直接使用对象,而不得不借助指针和引用来实现”这是《C++ Primer》这本C++经典书籍对C++语言的一番经典评论。既然得用指针来管理继承层次中的对象,那就意味着得很小心很小心的使用 new 和 delete 来创建和销毁动态变量。这让程序员很是头疼,再NX的软件系统,在所谓的硬件陷阱面前也得战战兢兢,都是地雷啊。因而如何聪明的管理内存,在C++刚出生时就被考虑到了,当时得到的一个答案是使用句柄类,而它的另一名字就是智能指针。
《C++沉思录》这本书,真是越看越喜欢,虽然它很老,然而钻石的光芒是不会随着时间推移而变黯淡的。其中一篇《一个面向对象程序范例》,侧重是通过一个小玩具(计算表达式打印程序)来教你如何构建句柄类。由于作者的精心策划,详细而不啰唆地推演,一个可以普遍适用的如何构建类的方法便展现在我们眼前。句柄类这东西到了java那里可能没有这许多用,但是构建类的基本方法,我想在其他面向对象语言那里一样还是可以用上的。
概而括之地讲,解决问题的根本就是,通过抽象找到问题的本质,再经过建模对被抽了象的问题进行处理,从而得到解决方案。
而对于抽象这个抽象概念......可以大致理解为,找到不同对象的共同点和不同点,集共同点(或部分共同点)于一身的东西就是父类,既有共同点又有不同点的东西就是子类。举个例子,对于美女和野兽这两种对象,共同点是都有毛都要吃要拉还可以繁殖后代等等;不同点是美女两条腿,野兽四条腿等等;由共同点归为一类为动物;那么动物就是父类,美女和野兽则是子类。分类就是抽象思维的一种。
现把作者思路提取如下:
一、问题描述
1. 实体描述
算术表达式树
2. 期望结果
运行段代码(设想可能会用的代码)将会输出什么结果,如《一个面向对象程序范例--沉思录》的那段 main() 程序
二、逻辑建模
1. 实体转化为对象
把表达式树实体划分为“节点”和“边”两种对象
2. 对象细分
节点可分为三种:整数表达式节点、一元表达式节点、二元表达式节点
3. 对象关系
三种节点对象相互独立
4. 对象抽象
三种节点对象可抽象为“节点”这个概念(这不是废话,而恰是面向对象语言,通过它和继承得到多态调用的手段)
三、程序建模
1. 创建类
节点(抽象类):Expr_node
整数表达式:Int_node: public Expr_node
一元表达式:Unary_node: public Expr_node
二元表达式:Binary_node: public Expr_node
定义类的接口和数据。。。
2. 模拟类实现(预判可能出现的问题)
删除节点对象遇到麻烦,内存管理无法实现
3. 调整抽象
通过句柄类解决内存管理问题
4. 完成具体实现
逐个实现类的操作函数