C++沉思录读书笔记(30章)- 一个IO库的两种设计

来源:互联网 发布:淘宝上拍卖的车被骗了 编辑:程序博客网 时间:2024/05/04 08:08
假设需要对自定义的String类进行各种类型的IO

设计一,使用继承进行抽象,代码如下

class Write{public:virtual ~Write();virtual void send(const char*, int) = 0;};Write& operator<<(Write& w, const String& s){for(int i = 0; i< s.size(); i++){char c = s[i];w.send(&c, 1);}return w;};class FileWrite: public Write{//定义自己的成员,构造函数,析构函数//定义自己的send操作};//使用示范FileWrite s = ...String hello = "Hello";s << hello;


设计二,使用模板进行抽象,代码如下:

template<class W>W& operator<<(W& w, const String& s){for(int i = 0; i< s.size(); i++){char c = s[i];send(w, &c, 1);}return w;};//对每个对String应用于其上的对象定义不同的send函数,下面是一个文件指针的例子void send(File*f, const char *p, int n){for(int i=0; i<n; i++)putc(*p++, f);}

比较:设计二在编译的时候就已知的IO包对象,设计一需要在运行时确定IO包对象,也就是说,设计二可以在编译时就确定好调用那个IO对象的send函数,而设计一需要在运行时才确定调用那个IO类的send成员函数,因此设计二的效率更高

原创粉丝点击