假设需要对自定义的String类进行各种类型的IO
比较:设计二在编译的时候就已知的IO包对象,设计一需要在运行时确定IO包对象,也就是说,设计二可以在编译时就确定好调用那个IO对象的send函数,而设计一需要在运行时才确定调用那个IO类的send成员函数,因此设计二的效率更高
设计一,使用继承进行抽象,代码如下
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成员函数,因此设计二的效率更高