练习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;
}
欢迎大佬批评指正,共同交流!