这道题目是C++ primer中第12章的一个习题,习题12.13.这个题目给你一步步的实现并完善了题目的要求。比较适合初学者。
题目的要求就是扩展书上的Screen 类,使之包含move,set,display操作,完成如下测试:
myScreen.move(4,0).set('#').display(cout);
//myScreen为屏幕类的一个对象,move使光标移到(4,0)点,set设置当前位置的值为'#',display显示;
附上代码和注释。
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
class Screen {
public:
//此种构造方法能处理传递过来的s,完成对屏幕的初始化
Screen(int x, int y, const string &s):cursor(0),height(x),width(y) {//初始化屏幕和当前光标的位置
contents.assign(x*y, 'g');
if(s.size() != 0) contents.replace(0, s.size(), s);
}
char get() {return contents[cursor];}
//添加了容错处理
Screen& move(int x, int y) {
if(x >= height || y >= width) {
cerr << "unvaliable row or column" << endl;
throw EXIT_FAILURE;
}
cursor = x*width + y;
return *this;//返回对自身的引用
}
Screen& set(char c) {
contents[cursor] = c;
return *this;
}
//使字符串分行显示
//两个重载函数,分别有const对象和非const对象调用。并且由于两个函数的函数体一样,故抽出来作为一个函数
void display(ostream &os) {
do_display(os);
}
const void display(ostream &os) const {
do_display(os);
}
private:
string contents;
string::size_type cursor;
string::size_type height, width;
inline const void do_display(ostream &os) const{
string::size_type index = 0;
while(index != contents.size()) {
if(index % this->width == 0) os << endl;
os << contents[index];
index ++;
}
os << endl;
}
};
/*const void Screen::display(ostream &os) const {
string::size_type index = 0;
while(index != contents.size()) {
if(index % width == 0) os << endl;
os << contents[index];
index ++;
}
os << endl;
}*/
int main()
{
string str;
str = "aaaaabbbbbcccccdddddeeeee";
Screen myScreen(6, 5, str);
const Screen youScreen(9, 8, str);
myScreen.move(4, 0).set('#').display(cout);
youScreen.display(cout);
return 0;
}
总结:不断完善和优化代码,是非常有意思的事情。在这个过程中你能学到很多的东西。我感觉比完成一道题目所学到的东西还要多。