【发布时间】:2013-11-21 16:45:47
【问题描述】:
我有两个类 Screen 和 Window_Mgr(C++ Primer 5th Edition Chapter 7)。
- Screen 是一个包含三个 string::size_types 和一个 string 作为数据成员的类。
- Window_Mgr 是一个包含 vectorScreen> 类型的对象 Screens 的类。
- 它使用 Screen 中的构造函数使用值 (24,80,' ') 初始化 vectorScreen>。李>
- void Window_Mgr::clear(vector::size_type i) 是一个访问字符串私有成员并清除所有数据的函数。
我想以只有 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;
}
};
【问题讨论】:
标签: c++ header include forward-declaration