Screen と Window_Mgr (C++ Primer 5th Edition Chapter 7) の 2 つのクラスがあります。
- Screen は、3 つのstring::size_typesと文字列をデータ メンバーとして含むクラスです。
 - Window_Mgr は、 vector< Screen >型のオブジェクトScreensを含むクラスです。
 - Screen のコンストラクターを使用して、ベクトル < Screen >を値(24,80,' ')で初期化します。
 - void Window_Mgr::clear(vector::size_type i)は、string のプライベート メンバーにアクセスし、すべてのデータをクリアする関数です。
 
Window_Mgr::clear だけが Screen のフレンドになるように、このコードを書きたいと思います。
私が直面している問題は次のとおりです。
- Screen の前に Window_Mgr を不完全な宣言で定義すると、 Screens を初期化できません。
 - Window_Mgr の前に Screen を不完全な宣言で定義すると、 Window_Mgr::clearをScreenのフレンドとして宣言できません。
 
私はそれらを別々のヘッダーファイルでインクルードしようとしましたが、それは本当に混乱でした.
#include <iostream>
#include <vector>
class Screen;
struct Window_Mgr{
public:
    //    using Screen_Index = std::vector<Screen>::size_type;
    typedef std::vector<Screen>::size_type Screen_Index;
    void clear(Screen_Index i);
    Window_Mgr() = default;
private:
    std::vector<Screen> Screens;
};
struct Screen{
    typedef std::string::size_type pos;
    friend void Window_Mgr::clear(Screen_Index i);
    Screen() = default;
    Screen(pos h, pos w, char s): height(h), width(w), contents(h*w,s){};
    char get() const { return contents[cursor];}
    char get(pos ht, pos width)const;
    Screen &move(pos r, pos c);
    Screen &set(char);
    Screen &set(pos, pos, char);
    Screen & display(std::ostream &);
    const Screen & display (std::ostream &) const;
    pos size() const;
private:
    pos cursor = 0;
    pos height = 0, width = 0;
    std::string contents;
    const Screen do_display (std::ostream& os) const
    {
        os << contents;
        return *this;
    }
};