第九章:一个课堂练习的分析(上)
想要学会游泳,就得亲自下水。
9-1 问题描述
目标:编写一系列用以操作“字符图象”的类和函数。所谓字符图象,就是一个可打印的矩形字符阵列
首先创建图象,
#include< iostream.h>
#include "Picture.h"
char* init[] = {"Paris", "in the", "Spring" };
int main()
{
Picture p(init, 3);
cout << p
}
打印结果:
Paris
In the
Spring
+------+
|Paris |
|in the|
|Spring|
+------+
有边框无边框左右对齐。
Paris +------+
in the|Paris |
Spring|in the|
|Spring|
+------+
9-2 接口设计
当解决此类问题时,如果能够把自己放在用户立场上去审视问题,能读问几句:“我希望有些什么样的操作,如何表述这样的操作?”,那会是很有益处的。
必须生成和打印图象,以3种方式组合图象。
加像框:1:p.frame(), 2:frame(p)取决于究竟是希望加边框以修改原图,还是希望产生一个新图象。另一方面:如果我们会使用复杂的表达式来构建Picture对象,则frame(p)更易于理解,特别是当p本身就是一个含有括号的复杂表达式的时候。
表示横向和纵向的连接:1:hcat(p,q),vcat(p, q) 2:更紧凑的写法,操作符。为了能更容易的建构复杂的图象。
#include
class Picture {
public:
Picture(const char* const*, int
};
ostream& operator<
Picture frame(const Picture&);
Picture operator&(const Picture&, const Picture&);
Picture operator|(const Picture&, const Picture&);
9-3 补遗
一个Picture需要一个指针,需要一个复制构造函数,一个析构函数,以及一个赋值操作符,此外,为了定义Picture对象数组,还需要一个缺省构造函数。
class Picture {
public:
Picture();
Picture(const char* const*, int);
~Picture();
Picture& operator=(const Picture&);
};
ostream& operator<
Picture frame(const Picture&);
Picture operator&(const Picture&, const Picture&);
Picture operator|(const Picture&, const Picture&);
9-4测试接口
能编译,不能进行连接。
#include
#include "Picture.h"
char *init[] = { "Paris", "in the ", "Spring" }
int main()
{
Picture p(init, 3);
cout << p << endl;
Picture q = frame(p);
cout <
Picture r = p|q:
cout << r << endl;
Picture s = q&r;
cout << s <
}
可以写的更紧凑些,得到最后那个图。
Picture p(init, 3);
Picture q - frame(p);
cout << frame(q&(p|q)) <
9-5 策略
如何表示一个Picture.实际上是一个二维字符数组。C++并不直接支持二维数组。
class Picture {
private:
int height, width;
char *data;
char& pisition(int row, int col) {
return data[row*width+col];
}
char position (int row, int col) const {
return data[row*width +col];
}
//...
};
区别:一个在const Picture 上执行操作,返回所需字符的一个副本,另一个允许直接读写给定字符的左值。(仔细思考一下。)
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/409557/viewspace-892046/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/409557/viewspace-892046/