我有两个类Screen和Window_Mgr(C ++ Primer第5版第7章)。
我想以这样的方式编写此代码,即只有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;
}
};
答案 0 :(得分:1)
考虑使用类而不是你的前向声明用于一个类,你可以在其中创建一个结构。这可能会导致您的一些问题。而不是使用朋友如何为Window_mgr调用两个单独的清除函数,在Screen中调用不同的清除函数。
你的window_mgr清楚就像是
void Window_Mgr::clear(int i)
{
Screens.at(i).clear();
}
你的屏幕清晰就像是
void Screen::clear()
{
//whatever you want to do to private variables here
}
当我的一位教授击败我们的脑袋时“课堂上的朋友不是程序员的朋友”
答案 1 :(得分:1)
您通过Screen
调用Window_Mgr
来违反封装。
Window_Mgr
是Screen
s的容器。 Window_Mgr
应调用屏幕的clear
方法。
struct Screen
{
void clear()
{
//...
}
};
struct Window_Mgr
{
std::vector<Screen> Screen_Container;
void clear_screen(unsigned int screen_index)
{
Screen_Container[screen_index].clear();
}
};
由于简单,我没有检查索引范围。
编辑1:友谊。
这里不需要友谊。 Window_Mgr
只能访问Screen
类在其界面中定义的内容。
此外,Screen
类不应该知道它是否在容器中;该概念属于Window_Mgr
类。