zoukankan      html  css  js  c++  java
  • C++ Primer 练习7.32(C++ Primer读书笔记)

    第七章 类

    练习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 << '
    ';
    	myscreen.display(std::cout);
        return 0;
    }
    

      

    对于这一句

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

    暂时只能改成

    std::vector<Screen> screens;

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

  • 相关阅读:
    揺する、揺らす、揺さぶる区別
    test
    W5N1のW2D2
    微软企业库6的使用方法
    Delphi XE6 原生解析json
    delphi URL 编码的转换
    Go语言配置与开发环境配置
    Win7 IIS下启用ASP.NET
    Windows2003远程桌面单会话登录
    IIS7应用程序池集成和经典的区别
  • 原文地址:https://www.cnblogs.com/wenruo/p/4849595.html
Copyright © 2011-2022 走看看