摘要:基于面向对象的字符图像设计 ——《C++沉思录》第10章 一个课堂练习的分析(下) 发表一下个人看法。面向对象的一大特点就是提供了句柄,句柄的的作用一是隐藏了具体的继承层次细节,二是实现自动管理内存,省去客户端管理内存的烦恼。 之前《字符图像》介绍了一个字符图像的设计。面向对象具有数据抽象、封装、动态绑定等特性,下面我们采用面向对象的思想来重新设计字符图像。 具体细节详见代码和注释。// 基于面向对象的字符图像设计#include using namespace std;// 前置声明,因为Picture中需要定义P_Node*指针class P_Node;// 定义句柄类(代理)class
阅读全文
摘要:字符图像 ——《C++沉思录》第9章 一个课堂练习的分析(上) 设计一个字符图像,用字符代替像素,实现的基本操作有加边框、将两个图像横排、竖排等。然后再对其进行一些扩展:横排下边对齐、竖排右边对齐、将重载运算符封装、去边框处理等。 具体细节详见代码和注释。// 字符图像#include #include using namespace std;// 图像类class Picture{private: int height; // 高 int width; // 宽 char* data; // 可用string代替 int isframe; // 标示...
阅读全文
摘要:基于面向对象的表达式实现 ——《C++沉思录》第8章 一个面向对象的程序范例 本文我们介绍一个基于面向对象的表达式实现,并对其扩展。面向对象有三个基本要素:数据抽象(封装)、继承、动态绑定(多态)。这个程序可以很好的说明这三个特性,以及说明面向对象可以很好的使得程序可维护、更灵活、易扩展。 我们给出以下表达式:(-5)*(3+4) 其表达式树为: 1.初步实现 我们定义节点类,节点指向节点的边我们用指针表示。具体实现相见代码和注释。// 基于面向对象的表达式简单实现#include #include using namespace std;// 定义节点抽象基类class Expr_Nod..
阅读全文
摘要:句柄类的实现:分割引用计数和原数据 ——《C++沉思录》第7章 句柄:第二部分 《句柄类》中,介绍了一种句柄的简单实现,其基本结构就是定义了三个类:Point类、Handle类、UPoint类。其中Point为实际的原数据类,Handle为句柄类,UPoint为实际操作的数据类,其成员除了Point的一个对象外还有个int型的技术。 这里我们先将UPoint中的两个成员分割,之后再将int型技术进行封装成一个标准的引用技术类UseCount。 1.Point和int 删除UPoint类,并将Handle中的UPoint* up指针删除,添加Point和int指针。#include using
阅读全文
摘要:句柄类 ——《C++沉思录》第六章 句柄:第一部分 三个类: Point:主体类,表示实际的数据 Handle:句柄类,用来引用代理主体类 UPoint:对Point的封装,增加了一个use count成员,用来记录主体类对象被引用代理的次数。该类完全可以省略,但是添加此类的好处是更便于管理。 对Handle的拷贝构造函数和赋值运算符的实现是通过对UPoint对象的use count修改来完成的。Handle中有两个写函数,有两种实现方式:指针语义和值语义,这里涉及了一项技术称作写时赋值(copy on write)。 具体代码如下:// 句柄类#include using namespace
阅读全文
摘要:代理类 (好久没写了,这段时间更迷茫了,不知道该做些什么。) ——《C++沉思录》第五章 代理类#include using namespace std;// 基类class Vehicle{private:public: Vehicle() {} virtual ~Vehicle() {} virtual double weight() const = 0; virtual void start() = 0; virtual Vehicle* copy() const = 0;};// 派生类class Truck : public Vehic...
阅读全文
摘要:设计一个追踪类——本文来自于《C++沉思录》中的例子。 用C++设计思想制作一个追踪类,实现功能: 1.基本的追踪 2.追踪开关 3.对于输出信息指定输出文件 程序如下:// 追踪类#include #include #include using namespace std;class MyTrace{private: bool ok_; FILE* f_;public: MyTrace() : ok_(true), f_(stdout) {} MyTrace(FILE* const f) : ok_(true), f_(f) {} void Print(con...
阅读全文