[笔记] 《c++ primer》显示器程序 Chapter7

补充Sales_data没有体现出的其他类特性

Screen.h

 1 #include <string>
 2 #include <iostream>
 3 
 4 class Screen {
 5 public:
 6     typedef std::string::size_type pos;
 7 #if defined(IN_CLASS_INITS) && defined(DEFAULT_FCNS)
 8     Screen() = default;  // needed because Screen has another constructor
 9 #else
10     Screen(): cursor(0), height(0), width(0) { }
11 #endif
12     // cursor initialized to 0 by its in-class initializer
13     Screen(pos ht, pos wd, char c): height(ht), width(wd), 
14                                     contents(ht * wd, c) { }
15     friend class Window_mgr;
16     Screen(pos ht = 0, pos wd = 0): 
17        cursor(0), height(ht), width(wd), contents(ht * wd, ' ') { }
18     char get() const              // get the character at the cursor
19         { return contents[cursor]; }       // implicitly inline
20     inline char get(pos ht, pos wd) const; // explicitly inline
21     Screen &clear(char = bkground);
22 private:
23     static const char bkground = ' ';
24 public:
25     Screen &move(pos r, pos c);      // can be made inline later
26     Screen &set(char);
27     Screen &set(pos, pos, char);
28     // other members as before
29     // display overloaded on whether the object is const or not
30     Screen &display(std::ostream &os) 
31                   { do_display(os); return *this; }
32     const Screen &display(std::ostream &os) const
33                   { do_display(os); return *this; }
34 private:
35      // function to do the work of displaying a Screen
36      void do_display(std::ostream &os) const {os << contents;}
37     // other members as before
38 private:
39 #ifdef IN_CLASS_INITS
40     pos cursor = 0;
41     pos height = 0, width = 0;
42 #else
43     pos cursor;
44     pos height, width;
45 #endif
46     std::string contents;
47 };
48 
49 Screen &Screen::clear(char c) 
50 {
51     contents = std::string(height*width, c);
52     return *this;
53 }
54 
55 inline                   // we can specify inline on the definition
56 Screen &Screen::move(pos r, pos c)
57 {
58     pos row = r * width; // compute the row location
59     cursor = row + c;    // move cursor to the column within that row
60     return *this;        // return this object as an lvalue
61 }
62 
63 char Screen::get(pos r, pos c) const // declared as inline in the class
64 {
65     pos row = r * width;      // compute row location
66     return contents[row + c]; // return character at the given column
67 }
68 
69 inline Screen &Screen::set(char c) 
70 { 
71     contents[cursor] = c; // set the new value at the current cursor location
72     return *this;         // return this object as an lvalue
73 }
74 inline Screen &Screen::set(pos r, pos col, char ch)
75 {
76     contents[r*width + col] = ch;  // set specified location to given value
77     return *this;                  // return this object as an lvalue
78 }

useScreen.cpp

 1 #include <iostream>
 2 using std::cout; using std::endl;
 3 
 4 #include <string>
 5 using std::string;
 6 
 7 #include "Screen.h"
 8 
 9 int main()
10 {
11     Screen myScreen(5,3);
12     // move the cursor to a given position, and set that character 
13     myScreen.move(4,0).set('#');
14 
15     Screen nextScreen(5, 5, 'X');
16     nextScreen.move(4,0).set('#').display(cout);
17     cout << "
";
18     nextScreen.display(cout);
19     cout << endl;
20 
21     const Screen blank(5, 3);
22     myScreen.set('#').display(cout);  // calls nonconst version
23     cout << endl;
24     blank.display(cout);              // calls const version
25     cout << endl;
26 
27     myScreen.clear('Z').display(cout); cout << endl;
28     myScreen.move(4,0);
29     myScreen.set('#');
30     myScreen.display(cout); cout << endl;
31     myScreen.clear('Z').display(cout); cout << endl;
32 
33     // if move returns Screen not Screen&
34     Screen temp = myScreen.move(4,0); // the return value would be copied
35     temp.set('#'); // the contents inside myScreen would be unchanged
36     myScreen.display(cout);
37     cout << endl;
38 }
原文地址:https://www.cnblogs.com/cxc1357/p/12210183.html