CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

请大家说一说友元吧。我感觉大家讨论的比较少

楼主happyparrot(快乐鹦鹉)2004-12-01 11:45:11 在 C/C++ / C++ 语言 提问

友元类该如何使用?  
  比如我现在有两个类,一个是记录数据的类,一个是对话框类。现在对话框类显示的数据都是这个数据类里面的。这两个类关系非常密切,但因为数据类还有其它用途,不能合并成一个类,那么是否可以定义成友元类呢?  
  可以说没有用过友元类,希望大家讨论一下。  
  假设A类和B类都定义了实例,m_A和m_B,并且相互定义成友元类。那么我在m_A中如何才能操作m_B的数据呢? 问题点数:30、回复次数:12Top

1 楼xuzheng318(忧郁王子)回复于 2004-12-01 11:49:15 得分 0

哇·   1楼   沙发  
  Top

2 楼xuzheng318(忧郁王子)回复于 2004-12-01 11:52:13 得分 10

friend  
  申明一个函数(或类)为友元,这个函数(或类)就可以访问类中的私有成员  
  ex:  
   
  class   C  
  {  
        int   a;  
  public:  
        friend   void   f();  
  }   cc;  
   
  friend   void   f()  
  {  
          cc.a   =   1;   //correct  
  }  
   
  void   nf()  
  {  
          cc.a   =   1;   //incorrect  
  }  
   
  f()就是class   C的对象cc的友元函数.  
   
  同理申明友元类Top

3 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-12-01 12:53:30 得分 0

哇,抢三楼!!Top

4 楼happyparrot(快乐鹦鹉)回复于 2004-12-01 12:55:26 得分 0

那么,如果我定义class   c的若干个实例c1,c2,c3时,  
  friend   void   f()  
  {  
          cc.a   =   1;   //correct  
  }  
  这个函数里面调用哪个?Top

5 楼Jinhao(辣子鸡丁·GAME就这样OVER了)回复于 2004-12-01 12:56:16 得分 5

class   A  
  {  
      friend   class   B;  
      friend   Return_Type   function(xxx,xxx,xxx);  
  };  
   
  B   和   Return_Type   function(xxx,xxx,xxx);   可以访问A的private   memberTop

6 楼qnjian(南一郎 )回复于 2004-12-01 13:52:39 得分 5

其实不难的,如果已声明B类为A类的友元类,如:  
  calss   A  
  {  
  public:  
              A()...  
              friend   B;  
  private:  
              int   a;  
              ....  
  };  
   
  那么经B类可以像在类A内部一样直接访问A类的成员,包括私有成员。  
  如:  
  class   B  
  {  
  public:  
              B()...  
        void   setValue(int   n)  
        {  
              A.a=n;  
          }  
  Private:  
  ......  
  };  
  友元函数也一样,如果你是我的朋友,我家里的东西都可以与你分享,你就可以直接到我家里来,要拿什么你有自由。  
  注意:1、友元关系不能传递。你是我的友元,小明是你的友元,但没有经我同意的话,小明就不是我的友元。  
     2、友元不能继承。你是我的友元。我同意你分享我的秘密,但我儿子可不一定同意。  
     3、友元不是双向的。我同意你分享我的秘密,你却不一定同意我分享你的秘密。必须都得到声明才行。Top

7 楼qnjian(南一郎 )回复于 2004-12-01 13:55:38 得分 0

补充一点:友元不是类的一部分,它可以放在类声明中的任意地方,不管是公有部分还是私有部分,作用是一样的。Top

8 楼qnjian(南一郎 )回复于 2004-12-01 14:01:55 得分 0

不好意思,后一个例子错了,改为(B类有了一个A类的内部成员):  
  class   B  
  {  
  public:  
              B()...  
        void   setValue(int   n)  
        {  
              cA.a=n;  
          }  
  Private:  
   A cA;  
  ......  
  };  
  Top

9 楼BluntBlade(信仰迷离·重构之道,在于Redo/Undo之间)回复于 2004-12-01 16:35:24 得分 0

唉……鸟人……Top

10 楼wwxsoft(婉儿)回复于 2004-12-01 16:46:08 得分 0

haha   ,分数多的没法处理了,就来散分呀!!!!!Top

11 楼avalonBBS("︶.︶メ)→( ̄ε ̄メ)回复于 2004-12-01 18:10:47 得分 0

UPUP:)Top

12 楼fjpqzm(梦花园)回复于 2004-12-01 18:30:31 得分 10

声明某个函数或类为其他函数或类的有元时,在编译时为什么  
  要在其前面在声明一下。如:  
  [code]  
  class     A;  
  ostream&   operator<<(ostream   &out,const   Cmystring   &rhs);  
  class   Cmystring  
  {  
  public:  
              A(***,***);  
              friend   ostream&   operator<<(ostream   &out,const   Cmystring   &rhs);  
   
  }  
  [\code]Top

相关问题

  • [讨论]关于SQL注入安全问题。(看到很多网站被破解,感觉有必要讨论)
  • 真的感觉SPRING不是特别的好,欢迎大家来讨论
  • [请问] 有多少朋友认为爱情是感觉的,为什么?
  • 大家讨论讨论,结个婚到底要花多少钱??
  • 你觉得什么时候最幸福?什么样的感觉叫幸福?欢迎讨论!
  • 讨论:vc++的出路? ---随着vs.net的正式发行,感觉到vc++的鸡肋作用,弃之可惜~~
  • 讨论,这个网站是如何实现的...(看过之后,你会感觉到什么叫差距)
  • 感觉好多人做车牌识别,小弟我有一小问题请教,征求大家讨论一下。
  • 【散分】终于做了完了作业,但是感觉很是不爽,有个问题大家讨论一下。。。
  • 文本搜索问题,如何能将速度达到最快,大家讨论一下,感觉很复杂哦!

关键词

  • 函数
  • 数据
  • 秘密
  • 类
  • 友元
  • 私有
  • 同意
  • friend
  • xxx
  • 成员

得分解答快速导航

  • 帖主:happyparrot
  • xuzheng318
  • Jinhao
  • qnjian
  • fjpqzm

相关链接

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

广告也精彩

反馈

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