关于友元类的成员函数

coffee_sugar 2015-02-04 06:07:32
小弟又来请教诸位大神了……
这次是关于友元函数的。
首先,我知道友元函数怎么去声明了,但是我写的这两个类让我十分纠结应该怎么搞……

class Screen {
public:
//注意这个声明
friend void Window_mgr::clear(ScreenIndex);
typedef std::string::size_type pos;
Screen() = default;
Screen(pos ht,pos wd,char c):height(ht), width(wd),
contents(ht*wd, c){}
Screen(pos ht,pos wd):height(ht),width(wd),contents(ht*wd,' '){};
char get() const
{ return contents[cursor];}
inline char get(pos ht,pos wd) const;
inline Screen &move(pos r, pos c);
Screen &set(char c);
Screen &set(pos ht,pos wd,char c);
Screen &display(std::ostream &os) {
do_display(os);
return *this;
}
const Screen &display(std::ostream &os) const {
do_display(os);
return *this;
}
private:
pos cursor = 0;
pos height = 0, width = 0;
std::string contents;
void do_display(std::ostream &os) const{
os<<contents;
}
};

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

第二个类

class Window_mgr{
public:
using ScreenIndex = std::vector<Screen>::size_type;
void clear(ScreenIndex);
private:
//注意这里,如果没有这个private的话我就能搞定了
std::vector<Screen> screens{Screen(24, 80, ' ')};
};

求大神能当做一个简单的健脑题帮忙解答下……我今天刚入手了c++ primer第五版的习题集,但那个练习题要比我这个简单,看了下也没啥参考价值。所以特来此地求解
...全文
274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
羽飞 2015-02-05
  • 打赏
  • 举报
回复
引用 3 楼 kzl332058242 的回复:
[quote=引用 2 楼 hnwyllmm 的回复:] 我感觉SCreen的clear不应该是friend,直接public成员,让Window_mgr调用就好了
那个clear的实现是这样的:

void Window_mgr::clear(ScreenIndex i) {
    Screen &s=screens[i];
    s.contents =std::string(s.height*s.width,' ');
}
就这个方法来说,我觉着contents是private的应该没啥问题。是不是遇到这种情况就是类的设计有问题?[/quote] 明显改成public void cliear(void); 这样不是更简洁.......
coffee_sugar 2015-02-05
  • 打赏
  • 举报
回复
其实我是在想,是不是有的时候友元是声明不出来的。因为以前只碰过c#和一点点的java,友元的使用上我没啥经验。这个东西是不是应该尽量避免使用(我是这么认为的)?
fly_dragon_fly 2015-02-05
  • 打赏
  • 举报
回复
contents是private,但没有成员函数可以修改
coffee_sugar 2015-02-05
  • 打赏
  • 举报
回复
引用 2 楼 hnwyllmm 的回复:
我感觉SCreen的clear不应该是friend,直接public成员,让Window_mgr调用就好了
那个clear的实现是这样的:

void Window_mgr::clear(ScreenIndex i) {
    Screen &s=screens[i];
    s.contents =std::string(s.height*s.width,' ');
}
就这个方法来说,我觉着contents是private的应该没啥问题。是不是遇到这种情况就是类的设计有问题?
羽飞 2015-02-04
  • 打赏
  • 举报
回复
我感觉SCreen的clear不应该是friend,直接public成员,让Window_mgr调用就好了
勤奋的小游侠 2015-02-04
  • 打赏
  • 举报
回复
把这句void clear(ScreenIndex); 直接换成void clear(Screen); 就容易多了

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧