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;
}
};