• [笔记] 《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 }
  • 相关阅读:
    03_线性表
    02_算法与数据结构
    01_python中内置类型的时间复杂度
    00_常见的时间复杂度
    03_docker导出和导入镜像
    09_创建mysql数据库的用户
    14_linux添加主机列表
    13_linux修改主机名
    12_centos7安装好后的网络设置
    00_使用pdb调试python代码
  • 原文地址:https://www.cnblogs.com/cxc1357/p/12210183.html
Copyright © 2020-2023  润新知