C++ Primer 练习7.32(C++ Primer读书笔记)

时间:2022-09-27 18:57:23

第七章 类

练习7.32  定义你自己的Screen和Window_mgr,其中clear是Window_mgr的成员,是Screen的友元。

由于Window_mgr中含有Screen对象,所以在Window_mgr之前要声明Screen。

因为clear中调用Screen成员,所以Screen要在clear定义之前定义。

因为Screen类中要声明友元函数clear,而clear是Window_mgr的成员函数,所以在Screen之前要定义Window_mgr。

好乱啊啊啊啊

代码:

#include <iostream>
#include <string>
#include <vector> class Screen; class Window_mgr {
public:
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
std::vector<Screen> screens;//{Screen(24, 80, ' ')};
}; class Screen {
public:
typedef std::string::size_type pos;
Screen() = default;
Screen(int ht, int wd) : height(ht), width(wd), contents(ht * wd, ' ') {}
Screen(pos ht, pos wd, char c) : height(ht), width(wd), contents(ht * wd, c) {}
char get() const // 读取光标处的字符
{
return contents[cursor];
}
inline char get(pos ht, pos wd) const;
Screen &move(pos r, pos c);
void some_number() const;
Screen &set(char);
Screen &set(pos, pos, char);
Screen &display(std::ostream &os)
{
do_display(os);
return *this;
}
const Screen &display(std::ostream &os) const
{
do_display(os);
return *this;
}
//friend class Window_mgr;
friend void Window_mgr::clear(ScreenIndex);
private:
pos cursor = 0;
pos height = 0, width = 0;
mutable size_t access_ctr;
std::string contents;
void do_display(std::ostream &os) const
{
os << contents;
}
}; inline Screen &Screen::move(pos r, pos c)
{
pos row = r * width;
cursor = row + c;
return *this;
} char Screen::get(pos r, pos c) const
{
pos row = r * width;
return contents[row + c];
} void Screen::some_number() const
{
++access_ctr;
} inline Screen &Screen::set(char c)
{
contents[cursor] = c;
return *this;
} inline Screen& Screen::set(pos r, pos col, char ch)
{
contents[r * width + col] = ch;
return *this;
} void Window_mgr::clear(ScreenIndex i)
{
Screen &s = screens[i];
s.contents = std::string(s.height * s.width, ' ');
} int main()
{
Screen myscreen(5, 5, 'X');
myscreen.move(4, 0).set('#').display(std::cout);
std::cout << '\n';
myscreen.display(std::cout);
return 0;
}

  

对于这一句

std::vector<Screen> screens{Screen(24, 80, ' ')};

暂时只能改成

std::vector<Screen> screens;

因为第一个需要调用构造函数,那样的话。。。Screen就要定义在Window_mgr前面。。。。我要疯了。。。。

C++ Primer 练习7.32(C++ Primer读书笔记)的更多相关文章

  1. 《C Primer Plus 第五版》读书笔记

    CH1-2:概述 链接器:链接库代码.启动代码(start-up code) CH3-5:数据.字符串.运算符 1 数据类型存储方式:整数类型.浮点数类型 2 浮点数存储:小数部分+指数部分 3 in ...

  2. C&plus;&plus; Primer(第五版)读书笔记 &amp&semi; 习题解答 --- Chapter 2

    Chapter 2.1 1. 数据类型决定了程序中数据和操作的意义. 2. C++定义了一套基本数据类型,其中包括算术类型和一个名为void的特殊类型.算术类型包含了字符.整型.布尔值以及浮点数.vo ...

  3. 《C&plus;&plus; Primer Plus 第六版》读书笔记

    CH1-3:处理数据 1 列表初始化 char c={31325}:不允许缩窄 char c={66}; char c={x}:不能为变量 2 强制类型转换 (typename) value type ...

  4. C&plus;&plus;primer(第五版)读书笔记&amp&semi;习题解答---CHAPTER 3

    C++标准库类型包括:string,vector和迭代器,其中string是可变长的字符序列,vector存放的是某种给定类型对象的可变长序列,迭代器是string和vector的配套类型,常被用于访 ...

  5. C&plus;&plus; Primer(第五版)读书笔记 &amp&semi; 习题解答 --- Chapter 3

    Chapter 3.1 1. using声明具有如下的形式: using namespace::name; Chapter 3.2 1. C++标准一方面对库类型所提供的操作做了规定,另一方面也对库的 ...

  6. C&plus;&plus; Primer(第五版)读书笔记 &amp&semi; 习题解答 --- Chapter 1

    Chapter 1.1 1. 每个C++程序都必须有且只能有一个main函数,main函数的返回类型必须是int.操作系统通过调用main函数来运行C++程序. 2. 一个函数的定义包含四部分:返回类 ...

  7. Key Technologies Primer 读书笔记,翻译 --- Struct 学习 1

    原文链接:https://struts.apache.org/primer.html 本来想写成读书笔记的,结果还是变成翻译,谨作记录,学习.   1.HTML -- 见我前面文章 2.Interne ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  9. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  10. 《C&plus;&plus; Primer 4th》读书笔记 序

    注:本系列读书笔记是博主写作于两三年前的,所以是基于<C++ Primer>第四版的,目前该书已更新至第五版,第五版是基于C++11标准的,貌似更新挺多的.博主今年应届硕士毕业,如若过阵子 ...

随机推荐

  1. C语言typedef的用法(转)

    http://www.cnblogs.com/afarmer/archive/2011/05/05/2038201.html 一.基本概念剖析 int* (*a[5])(int, char*);    ...

  2. 拾遗:『ext4 Quota』

    一.关闭selinux [root@ home]# sestatus -v SELinux status: disabled 示例:临时关闭 [root@ home]# setenforce 示例:永 ...

  3. Coin Change

    You are given coins of different denominations and a total amount of money amount. Write a function ...

  4. Problem&colon;Minesweeper Master

    Google code jam Qualification Round 2014 题目链接:https://code.google.com/codejam/contest/dashboard?c=29 ...

  5. angularjs基本执行流程

    近期温习了下angularjs执行流程,备记下.以便查看. 主要的执行流程例如以下: 1.用户请求应用起始页. 2.用户的浏览器向server发起一次HTTP连接,然后载入index.html页面,这 ...

  6. python算法-选择排序

    核心算法:固定位置,选择元素,即:先从序列中,找到最小的元素,放在第一个位置,之后找到第二小的元素,放在第二个元素,以此类推,就可以完成整个排序工作了. 代码示例如下: x=[6,3,2,7,4,9, ...

  7. react-native No bundle URL present

    解决方案: 1.删除ios目录下的build的目录,关闭模拟器,重新react-native run-ios大多数情况下可以解决 2.

  8. ExecuteNonQuery方法、ExecuteScalar方法、ExecuteReader方法的区别

    ----ExecuteNonQuery():执行命令对象的SQL语句,返回一个int类型变量,如果SQL语句是对数据库的记录进行操作(如记录的增加.删除和更新),那么方法将返回操作所影响的记录条数.- ...

  9. kerberos认证的步骤,学习笔记

    .KDC,uname,upwd -x算法=>authticator 暗号 .KDC ->uname,pwd->x1算法->解密authticator 确认客户端身份->生 ...

  10. linux -- Ubuntu报错&OpenCurlyDoubleQuote;unable to locate package&period;&period;&period;”

    有时候在Ubuntu命令行中执行安装某个文件的时候,如:sudo apt-get install xinit ,报 “unable to locate package...” 错误,解决办法如下 1. ...