[笔记] 《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_用于大型程序的工具 --命名空间
用于大型程序的工具 --命名空间 引言: 在一个给定作用域中定义的每一个名字在该作用域中必须是唯一的,对庞大.复杂的应用程序而言,这个要求可能难以满足.这样的应用程序的全局作用域中一般有很多名字定义. ...
随机推荐
- 接口自动化——读取Excle中遇到的问题
一.module 'openpyxl' has no attribute 'load_workbook'问题 原因:在pycharm中py文件名字为openpyxl导致 修改方法:重新对py名字进行命 ...
- Spring IOC 特性有哪些,不会读不懂源码!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 多线程.锁.JVM调优,都背出花啦,怎么一写代码还是乱糟糟? 为什么这些无论从书本. ...
- 13个精选的React JS框架
如果你正在使用 React.js 或 React Native 创建用户界面,可以试一试本文推荐的这些框架. React.js 和 React Native 是流行的用户界面(UI)开发平台,且都是开 ...
- PBFT共识算法详解
PBFT(Practical Byzantine Fault Tolerance,实用拜占庭容错) 一.概述 拜占庭将军问题最早是由 Leslie Lamport 在 1982 年发表的论文<T ...
- OO_Unit 3 JML规格化设计总结
OO_Unit 3 JML规格化设计总结 JML语言概述(Level 0) 概念定义 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML ...
- Linux 网络工具中的瑞士军刀 - socat & netcat
独立博客阅读:https://ryan4yin.space/posts/socat-netcat/ 文中的命令均在 macOS Big Sur 和 Opensuse Tumbleweed 上测试通过 ...
- CentOS8搭建FTP服务器
2021.2.20 更新 1 概述 文章核心: CentOS8使用vsftpd搭建FTP服务器 安装以及测试的详细过程 2 安装 2.1 安装vsftpd+ftp sudo yum install - ...
- 一个Bug,让我发现了 Java 界的.AJ(锥)!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 话我放这,踩过的坑越多头发越少! 说来也是奇怪,只要是学编程的,从初次接触的 Jav ...
- JVM调优基础到进阶
GC和GC Tuning GC的基础知识 1.什么是垃圾 C语言申请内存:malloc free C++: new delete c/C++ 手动回收内存 Java: new ? 自动内存回收,编程上 ...
- Day14_84_通过反射机制修改和获取class里的属性值
通过反射机制修改和获取class里的属性值 * 属性对象.set(Object,属性值) 给Object对象中的某个属性赋值(属性对象) * 属性对象.get(Object); 获取Object对象中 ...