CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

有关友元的几个问题?

楼主jobs002(Oh! Office)2006-03-04 07:46:48 在 C/C++ / C++ 语言 提问

我想用友元实现下一个功能:  
  Teacher   类和Student类中Teacher需要访问学生的成绩,比如语文老师要修改学生的语文成绩  
  class   Teacher                                 class   Student  
                                                              {  
                                                                        private:  
                                                                        char   sno[5];  
                                                                        unsigned   int   score1;  
                                                                        unsigned   int   score2;  
                                                                      unsigned   int   score3;  
                                                                }  
  {  
          private:  
          char   tno[5];  
          char   tname[20];  
          char   TeacherType[5];  
  }请问如何实现友元函数modifyStudent,使得一个老师只能修改学生的一个成绩。最好能有代码.  
   
   
   
  题目二:  
  Ostream   &operator   <<(POINT   &pt)  
  {  
                cout<<pt.x<<endl;  
                cout<<pt.y<<endl;  
                    return   (OStream(cout));//调用默认拷贝构造函数  
  }    
  这段代码实现<<的重载请问对吗?如果不对请帮我改一改。  
  class   POINT  
  {     private:  
                    int   x;  
                    int   y;  
        public:  
            friend     Ostream&   Ostream::operator   <<(POINT   &pt);  
  }  
  问题点数:50、回复次数:21Top

1 楼jobs002(Oh! Office)回复于 2006-03-04 08:25:24 得分 0

只能我自己顶了......Top

2 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-04 08:41:05 得分 8

2.  
  ostream   &operator   <<(ostream&   os,   POINT   &pt)  
  {  
                cout<<pt.x<<endl;  
                cout<<pt.y<<endl;  
                return   os;  
  }    
  Top

3 楼jobs002(Oh! Office)回复于 2006-03-04 08:44:09 得分 0

我认为是:  
  cout<<pt//POINT   pt;  
  cout.operator   <<(   POINT&   pt)Top

4 楼rabbit729(无名胜有名)回复于 2006-03-04 09:07:43 得分 0

个人认为:第一个问题:我认为这个要求根本没必要利用友元函数来实现,就在student类中分别为三个成绩各自定义一个修改成绩的函数就可以了。第二个问题:windywater   的回答完全正确!Top

5 楼windywater(超级宇宙无敌大白痴)回复于 2006-03-04 09:17:37 得分 0

楼主的意思是,只有老师能修改相应的成绩,而学生自己没有这个权力,所以不能定义在学生类里。我们现在数据结构都没学,更别谈设计模式了,等高手来解答吧,帮顶一下。Top

6 楼jobs002(Oh! Office)回复于 2006-03-04 09:19:15 得分 0

第一个问题,学生的成绩不能随便修改,如果定义为成员函数,那么在main中随便调用一下就能修改,那怎么可能,只能教师能够修改学生的成绩。  
  第二个问题,<<重载int的函数模型   Ostream   &   operator(int)  
  我想修改一下库的函数,那么我的那个错误了没有??请详细解答,如果错误,为什么??Top

7 楼theory88(伟)回复于 2006-03-04 09:33:52 得分 10

class   Student;  
  class   Teacher                                  
  {  
    private:  
          char   tno[5];  
          char   tname[20];  
          char   TeacherType[5];  
    public:  
          void   modifyStudent(Student&   st,   int   score);  
  }  
  class   Student  
  {  
    private:  
          char   sno[5];  
          unsigned   int   score1;  
          unsigned   int   score2;  
          unsigned   int   score3;  
    public:  
          friend   void   Teacher::modifyStudent(Student&   st,   int   score);  
  }  
  void   Teacher::modifyStudent(Student&   st,   int   score)  
  {  
          switch(this.TeacherType)  
          {  
                case   course1:     st.score1   =   score;     break;  
                case   course2:     st.score2   =   score;     break;  
                case   course3:     st.score3   =   score;     break;  
                default:               break;  
          }  
  }  
   
   
   
  第二个问题   windywater   的回答完全正确!Top

8 楼jobs002(Oh! Office)回复于 2006-03-04 09:49:27 得分 0

第二个问题我的对不对?如果错误,错在什么地方??详细解释一下Top

9 楼njSeeWhy(北海鲲鹏)回复于 2006-03-04 10:18:02 得分 0

对于楼主的第一个问题,大家似乎有一个概念没弄清:类本身和类的使用者是两个不同的实体。并不是说Teacher类可以修改Student的成绩就意味着老师能改成绩而学生不能改。要知道,成绩是Student类的私有数据,按照各位的逻辑,那么学生是最能够修改自己成绩的,而且改了还可以让其他人都不知道,因为成绩是他自己私有的,呵呵。因此,我觉得从类的设计上来说,给Student类增加修改成绩的公共方法并没有错,关键是Student类应该暴露给谁来用。比如,只有那些应该知道学生信息的类,比如Teacher,才能看到Student类(通过包含相应的头文件),这样应该就可以实现楼主想要的效果了。Top

10 楼jobs002(Oh! Office)回复于 2006-03-04 10:50:43 得分 0

再顶一顶,还是第二个问题  
  Top

11 楼zh2817()回复于 2006-03-04 10:51:53 得分 8

1.  
  除了一般的函数可以作为某个类的友元外,一个类的成员函数也可以作为另一个类的友元函数,这样该友元的成员函数不但可以访问自己所在类的成员,还可以访问其他类中的成员。  
  既然Teacher   类和Student类中Teacher需要访问学生的成绩,比如语文老师要修改学生的语文成绩:就得添加变量a、b、c来存储某科老师的变量,对theory88的做点修改:  
  class   Student;  
  class   Teacher                                  
  {  
    private:  
          char   tno[5];  
          char   tname[20];  
          char   TeacherType[5];  
  int   a,b,c;  
    public:  
          void   modifyStudent(Student&);  
  };  
  class   Student  
  {  
  private:  
          char   sno[5];  
          unsigned   int   score1;  
          unsigned   int   score2;  
          unsigned   int   score3;  
  public:  
          friend   void   Teacher::modifyStudent(Student&);  
  };  
  void   Teacher::modifyStudent(Student   &int   score)  
  {  
  a   =   score.score1;  
  b   =   score.score2;  
  c   =   score.score3;  
  }  
  2.  
  ostream   &operator   <<(ostream&   os,   POINT   &pt)  
  {  
                cout<<pt.x<<endl;  
                cout<<pt.y<<endl;  
                return   os;  
  }    
   
   
  Top

12 楼waxic(waxic)回复于 2006-03-04 10:52:14 得分 0

Ostream   &operator   <<(ostream   &   os,   POINT   &pt)  
  {  
                os<<pt.x<<endl;  
                os<<pt.y<<endl;  
                return   os;  
  }    
  Top

13 楼willingbupt(buptcsdn)回复于 2006-03-04 11:25:53 得分 7

both   of   tow   are   right  
  1.ostream   &operator   <<(ostream&   os,   POINT   &pt)  
  {  
                cout<<pt.x<<endl;  
                cout<<pt.y<<endl;  
                return   os;  
  }    
   
  2.ostream   &operator   <<(ostream   &   os,   POINT   &pt)  
  {  
                os<<pt.x<<endl;  
                os<<pt.y<<endl;  
                return   os;  
  }    
   
  Top

14 楼jobs002(Oh! Office)回复于 2006-03-04 11:31:16 得分 0

Ostream   &operator   <<(POINT   &pt)  
  {  
                cout<<pt.x<<endl;  
                cout<<pt.y<<endl;  
                    return   (OStream(cout));//调用默认拷贝构造函数  
  }    
  错在什么地方?Top

15 楼jobs002(Oh! Office)回复于 2006-03-04 16:39:43 得分 0

我现在想问这个问题,顶一个,第一个不讨论了Top

16 楼jobs002(Oh! Office)回复于 2006-03-05 09:23:35 得分 0

ostream   &operator   <<(ostream   &   os,   POINT   &pt)  
  {  
                os<<pt.x<<endl;  
                os<<pt.y<<endl;  
                return   os;  
  }    
  全局函数....  
   
  昨天看了看钱能的书,p430,因为ostream类在头文件iostream.h头文件定义,是标准类库,所以用户只能继承,不能修改标准类库,所以它更不能是ostream类的成员。请问标准类库为什么不能修改??Top

17 楼theory88(伟)回复于 2006-03-05 09:43:07 得分 0

类库是编译过的dll吧Top

18 楼wjd7623054(千古风流)回复于 2006-03-05 12:42:13 得分 0

看来我有好多的C++基础要补习Top

19 楼njSeeWhy(北海鲲鹏)回复于 2006-03-06 09:21:41 得分 12

输出流的操作符规定必须接受一个ostream&,并返回ostream&,这样才能连续地输出:  
  比如   cout<<a<<b<<c。C++规定,重载运算符不能修改运算符操作数的个数,所以楼主的定义是错误的。Top

20 楼Dugowe(我不是火星人,我家狗狗才是..)回复于 2006-03-06 09:55:05 得分 5

关于第一个问题  
        建议应用友元类     完全可以自己查书解决  
   
   
  第二个问题    
      那个宇宙。。。大白痴说得对  
  class   POINT  
  {     private:  
                    int   x;  
                    int   y;  
        public:  
            friend     ostream   operator   <<(ostream   &os,const   POINT   &pt);  
  }  
  ostream   &operator<<(ostream   &os,const   POINT   &pt)  
  {  
          os<<POINT.st;  
          return   os;  
  }  
  可以直接重载类的<<操作符Top

21 楼Dugowe(我不是火星人,我家狗狗才是..)回复于 2006-03-06 09:57:33 得分 0

关于第一个问题  
        建议应用友元类     完全可以自己查书解决  
   
   
  第二个问题    
      那个宇宙。。。大白痴说得对  
   
  class   POINT  
  {     private:  
                    int   m_x;  
                    int   m_y;  
        public:  
            friend     ostream   operator   <<   (ostream   &os,const   POINT   &pt);  
  }  
   
  ostream   &operator   <<   (ostream   &os,const   POINT   &pt)         //overload   <<  
  {  
          os<<POINT.st;  
          return   os;  
  }  
  可以直接重载类的<<操作符  
  Top

相关问题

  • c++学习小疑难!?有关返回值,有关友元函数
  • 一个pure c++ 问题,帮我看看,有关友元的.
  • 有关友元定义函数的问题?
  • 请各位朋友给我推荐几本有关SQL server的好书
  • 英文好的朋友帮我翻译几句有关Vc编程的句子
  • 生日+元旦!友情赠送!还有一个有关终身的问题!
  • 有关友元函数的一个题目。请大家帮帮忙
  • 有关红外通讯的几个问题,请从事这方面的朋友进来看一看
  • 怪事,头次发帖,望高手指教,有关友元函数的一个问题。
  • 有关同时使用模板和友元函数的困惑,望指点迷津

关键词

  • 学生
  • 修改
  • teacher
  • 语文
  • 成绩
  • 修改学生
  • 类
  • 老师
  • student
  • 实现

得分解答快速导航

  • 帖主:jobs002
  • windywater
  • theory88
  • zh2817
  • willingbupt
  • njSeeWhy
  • Dugowe

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo