[笔记] 《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 << "\n";
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 }
[笔记] 《c++ primer》显示器程序 Chapter7的更多相关文章
- Lua学习笔记4. coroutine协同程序和文件I/O、错误处理
Lua学习笔记4. coroutine协同程序和文件I/O.错误处理 coroutine Lua 的协同程序coroutine和线程比较类似,有独立的堆栈.局部变量.独立的指针指令,同时又能共享全局变 ...
- 微信小程序开发:学习笔记[7]——理解小程序的宿主环境
微信小程序开发:学习笔记[7]——理解小程序的宿主环境 渲染层与逻辑层 小程序的运行环境分成渲染层和逻辑层. 程序构造器
- Linux进程线程学习笔记:运行新程序
Linux进程线程学习笔记:运行新程序 周银辉 在上一篇中我们说到,当启动一个新进程以后,新进程会复制父进程的大部份上下 ...
- 个人学习笔记:C语言程序结构
个人笔记:C语言程序 函数 语句 输入输出对象 标识符 关键字 函数 一个C语言源程序,是由一个或多个函数定义顺序组成的,其中必须有一个函数名为main的主函数.C语言源程序中的函数是指完成特定数据处 ...
- [笔记] 《c++ primer》书店程序 Chapter7
Sales_data.h 1 #ifndef SALES_DATA_H 2 #define SALES_DATA_H 3 4 #include "Version_test.h" 5 ...
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
用于大型程序的工具 --多重继承与虚继承 引言: 大多数应用程序使用单个基类的公用继承,可是,在某些情况下,单继承是不够用的,由于可能无法为问题域建模,或者会对模型带来不必要的复杂性. 在这些情况下, ...
- C++ Primer 学习笔记_88_用于大型程序的工具 --异常处理[续1]
用于大型程序的工具 --异常处理[续1] 四.又一次抛出 有可能单个catch不能全然处理一个异常.在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch能 ...
- C++ Primer 学习笔记_87_用于大型程序的工具 --异常处理
用于大型程序的工具 --异常处理 引言: C++语言包括的一些特征在问题比較复杂,非个人所能管理时最为实用.如:异常处理.命名空间和多重继承. 相对于小的程序猿团队所能开发的系统需求而言,大规模编程[ ...
- C++ Primer 学习笔记_91_用于大型程序的工具 --命名空间
用于大型程序的工具 --命名空间 引言: 在一个给定作用域中定义的每一个名字在该作用域中必须是唯一的,对庞大.复杂的应用程序而言,这个要求可能难以满足.这样的应用程序的全局作用域中一般有很多名字定义. ...
随机推荐
- 一次 outline 去除经验(非继承属性,看着像继承)
情况描述: 目前维护的老项目是通过 easyui 生成的 html,嵌套结构非常多,当点击元素后,会有个边框???非常影响页面美观,这是啥迷惑点击交互??? 经验告诉我,这是 css 的 outlin ...
- css详解position五种属性用法及其含义
position(定位) position - 作为css属性三巨头(position.display.float)之一,它的作用是用来决定元素在文档中的定位方式.其属性值有五种,分别是 - stat ...
- Kafka和Stream架构的使用
Kafka的单节点运行 启动服务 Kafka 使用 ZooKeeper 如果你还没有 ZooKeeper 服务器,你需要先启动一个 ZooKeeper 服务器. 您可以通过与 kafka 打包在一起的 ...
- MySQL数据库高级三:查询截取分析(了解)
- day-5 xctf-when_did_you_born
xctf-when_did_you_born 题目传送门:https://adworld.xctf.org.cn/task/answer?type=pwn&number=2&grade ...
- 痞子衡嵌入式:i.MXRT中FlexSPI外设对AHB Burst Read特性的支持
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是FlexSPI外设对AHB Burst Read特性的支持. 痞子衡之前写过一篇关于FlexSPI LUT的文章 <从头开始认识i ...
- kube-router代替kube-proxy+calico
使用kubeadm安装kubernetes,并使用kube-router代替kube-proxy+calico网络. 即:kube-router providing service proxy, fi ...
- mooc人大单元测试4
@font-face { font-family: Wingdings } @font-face { font-family: 宋体 } @font-face { font-family: " ...
- hdu3182 状态压缩dp
题意: 一个人做汉堡包,每个汉堡包有自己的花费和价值,某些汉堡包必须是在其他的某些汉堡包已经做好了的前提下才能制作,给你这个人的初始钱数,问最大的价值是多少. 思路: 比较简单 ...
- hdu5014 构造b数列使得t最大(小想法)
题意: 给你一个序列a,他有n+1个数,每个数的范围是ai >= 0 && a[i] <= n,同时任意两个数字都是不相同的,就是ai != aj (i!=j), ...