[学习笔记]C++ Primer 练习7.32

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

头文件:Screen.h

#pragma once
#ifndef SCREEN_H
#define SCREEN_H
#include<iostream>
#include<string>
#include<vector>
using namespace std;
class Screen
{

	friend void Window_mgr::clear(ScreenIndex);
public:
	using pos = string::size_type;
	//typedef string::size_type pos;
	Screen() = default;
	Screen(pos h, pos w) :heigth(h), width(w), contents(h* w, ' ') {}
	Screen(pos h, pos w, char c) :heigth(h), width(w), contents(h* w, c) { }
	char get() const { return contents[cursor]; }
	char get(pos h, pos w) const;
	Screen& move(pos r, pos c);
	Screen& set(char);
	Screen& set(pos, pos, char);
	Screen& display(ostream& os) { do_display(os); return *this; }
	const Screen& display(ostream& os) const { do_display(os); return *this; }
	pos size() const;
	void some_member() const;

private:
	pos cursor = 0;
	pos heigth = 0;
	pos width = 0;
	string contents;
	mutable size_t access_ctr = 0;
	void do_display(ostream& os)const { os << "begin: "<<contents<<" end"<<endl; }
};

#endif // !SCREEN_H

头文件:Window_mgr.h

#pragma once
#ifndef WINDOW_MGR_H
#define WINDOW_MGR_H
#include<iostream>
#include<string>
#include<vector>
using namespace std;
extern class Screen;
class Window_mgr
{
private:
	vector<Screen> screens;
    //不能用Screen初始化 使用的话 又要先定义Screen 而Screen中声明友元函数需要先定义Window_mgr中的clear
public:
	using ScreenIndex = vector<Screen>::size_type;
	inline void clear(ScreenIndex);
	ScreenIndex addScreen(const Screen&);
	Screen& obtain_Screen(ScreenIndex s)  { return screens[s]; }
	vector<Screen>& obtain_Screens() { return screens; }
};
#endif // !WINDOW_MGR_H

源文件:类class_learning.cpp

#include<iostream>
#include<string>
#include<vector>
#include"Window_mgr.h"
#include"Screen.h"
using namespace std;
inline char Screen::get(pos h, pos w) const
{
	pos row = h * width;
	return contents[row + w];
}
inline Screen& Screen::move(pos r, pos c)
{
	pos row = r * width;
	cursor = row + c;
	return *this;
}
void Screen::some_member() const
{
	++access_ctr;
}

inline Screen& Screen::set(char c)
{
	contents[cursor] = c;
	return  *this;
}
inline Screen& Screen::set(pos rw, pos cl, char c)
{
	pos row = rw * width;
	contents[row + cl] = c;
	return *this;
}
inline Screen::pos Screen::size() const
{
	return heigth * width;
}


inline void Window_mgr::clear(ScreenIndex i)
{
	Screen& s = screens[i];
	s.contents = string(s.heigth * s.width, ' ');
}

Window_mgr::ScreenIndex Window_mgr::addScreen(const Screen& s)
{
	screens.push_back(s);
	return (screens.size() - 1);
}

int main()
{
	Window_mgr home;
	Screen s1(3, 4, 'a');
	Screen s2(3, 4, 'b');
	Screen s3(3, 4, 'c');
	Screen s4(3, 4, 'd');

	home.obtain_Screen(home.addScreen(s1)).display(cout);
	home.obtain_Screen(home.addScreen(s2)).display(cout);
	home.obtain_Screen(home.addScreen(s3)).display(cout);
	home.obtain_Screen(home.addScreen(s4)).display(cout);
	//home.obtain_Screen(home.addScreen(s1)).set(1, 2, 'c').display(cout);
	cout << "==========================" << endl;
	for (Window_mgr::ScreenIndex i = 0; i != home.obtain_Screens().size(); ++i)
	{
		home.obtain_Screen(i).display(cout);
	}
	//home.obtain_Screen(0).display(cout);
	//cout << home.addScreen(s3) << endl;
	
}

欢迎大佬批评指正,共同交流!

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值