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

在友元函数中不能访问私有变量??????

楼主waxic(waxic)2006-03-03 18:57:29 在 C/C++ / C++ 语言 提问

头文件  
  #ifndef   MYTIME0_H_  
  #define   MYTIME0_H_  
  #include<iostream>  
  using   namespace   std;  
  class   Time  
  {  
  private:  
  int   hours;  
  int   minutes;  
  public:  
  Time();  
  Time(int   h,int   m);  
  void   AddMin(int   m);  
  void   AddHr(int   h);  
  void   Reset(int   h,int   m);  
  Time   operator+(const   Time   &   t)   const;  
  Time   operator-(const   Time   &   t)   const;  
  Time   operator*(double   n)   const;  
  //void   show()   const;  
   
  friend   Time   operator*(double   m,const   Time   &t)  
  {   return   t*m;}  
  friend   ostream   &   operator<<(ostream   &   os,const   Time   &   t);  
  };  
   
  #endif  
   
  类描述文件  
  #include   "mytime0.h"  
   
  Time::Time()  
  {  
  hours=minutes=0;  
  }  
   
  Time::Time(int   h,int   m)  
  {  
  hours=h;  
  minutes=m;  
  }  
   
  void   Time::AddMin(int   m)  
  {  
  minutes   +=   m;  
  hours   +=minutes/60;  
  minutes   %=   60;  
  }  
   
  void   Time::AddHr(int   h)  
  {  
  hours   +=   h;  
  }  
   
  void   Time::Reset(int   h,int   m)  
  {  
  hours=h;  
  minutes=m;  
  }  
   
  Time   Time::operator+(const   Time   &t)   const  
  {  
  Time   sum;  
  sum.minutes   =   minutes   +   t.minutes;  
  sum.hours   =   hours   +   t.hours   +   sum.minutes/60;  
  sum.minutes   %=   60;  
  return   sum;  
  }  
   
  Time   Time::operator   -(const   Time   &   t)   const  
  {  
  Time   diff;  
  int   tot1,tot2;  
  tot1   =   t.minutes+60*t.hours;  
  tot2   =   minutes+60*hours;  
  diff.minutes=(tot2-tot1)%60;  
  diff.hours=(tot2-tot1)/60;  
  return   diff;  
  }  
   
  Time   Time::operator   *(double   n)   const  
  {  
  Time   result;  
  long   totalminutes   =   hours*n*60+minutes*n;  
  result.hours=totalminutes/60;  
  result.minutes=totalminutes%60;  
  return   result;  
  }  
   
  ostream   &   operator<<(ostream   &   os,   const   Time   &   t)  
  {  
  os<<t.hours<<"   hours,   "<<t.minutes<<"   minutes";  
  return   os;  
  }  
   
   
  编译的时候提示在operator<<这个函数中不能访问Time类的私有成员.  
    error   C2248:   'hours'   :   cannot   access   private   member   declared   in   class   'Time'  
  什么原因??  
  问题点数:5、回复次数:16Top

1 楼waxic(waxic)回复于 2006-03-03 19:59:55 得分 0

我是在vc中调试的,怎么没有人啊??Top

2 楼cunsh(村少)回复于 2006-03-03 20:08:05 得分 0

-   0   error(s),   0   warning(s)  
   
  vc++6Top

3 楼waxic(waxic)回复于 2006-03-03 20:11:22 得分 0

不会吧,楼上的,我怎么调试就有错误呢?我看程序也没错啊Top

4 楼willingbupt(buptcsdn)回复于 2006-03-03 20:39:36 得分 0

友元不属于任何类,应此不能访问私有成员是对的。Top

5 楼waxic(waxic)回复于 2006-03-03 20:43:33 得分 0

不是吧,定义友元函数不就是为了访问私有变量吗?Top

6 楼willingbupt(buptcsdn)回复于 2006-03-03 20:51:27 得分 0

但是这个程序中并没有什么错误。Top

7 楼waxic(waxic)回复于 2006-03-03 21:06:08 得分 0

但是怎么在vc中就是有错误?就是说在友元函数中不能访问私有变量Top

8 楼willingbupt(buptcsdn)回复于 2006-03-03 21:13:40 得分 0

友元不是成员函数,但是它可以访问类中的私有成员。友元的作用在于提高程序的运行效率,但是,它破坏了类的封装性和隐藏性,使得非成员函数可以访问类的私有成员。  
  呵呵,不好意思。Top

9 楼waxic(waxic)回复于 2006-03-03 21:27:57 得分 0

我是要用友元对操作符进行重载,好象没错啊,怎么在vc中就有错呢?Top

10 楼waxic(waxic)回复于 2006-03-03 22:28:19 得分 0

好了,调通了Top

11 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-03-03 22:54:00 得分 0

我在VC6中遇到过,  
  当重载<<   操作符为类的友元,如果头文件用  
  #include<iostream>  
  using   namespace   std;  
  这种形式要报错,如果头文件用  
  #include<iostream.h>  
  这种形式就不会出错。据说是没打补丁。  
   
  http://community.csdn.net/Expert/topic/4564/4564466.xml?temp=.705517  
  Top

12 楼fiftymetre(50米深蓝)回复于 2006-03-03 22:55:26 得分 0

重载 的问题吧。Top

13 楼waxic(waxic)回复于 2006-03-04 10:55:24 得分 0

谢谢A_B_C黄瓜Top

14 楼rain81(石头)回复于 2006-03-04 11:32:03 得分 0

我也刚遇到了这个问题,程序和这个类似  
  但是我改成     #include<iostream.h>后,又出现了下面的问题  
  error   LNK2001:   unresolved   external   symbol   _WinMain@16  
  Debug/exercise.exe   :   fatal   error   LNK1120:   1   unresolved   externals  
   
  请大家帮忙看一下,到底是什么引起的这个错误!  
  谢谢!Top

15 楼A_B_C_ABC(黄瓜@YouCanDoIt)回复于 2006-03-04 13:22:36 得分 0

rain81(小磊):  
  你的工程建错了吧,连接程序找不到_WinMain     .Top

16 楼rain81(石头)回复于 2006-03-05 22:20:44 得分 0

谢谢   A_B_C_ABC(黄瓜)  
  我调试好了!Top

相关问题

  • 为啥我的友元函数不能访问私有变量
  • 把一个函数声明为一个类的友员,可是在函数中用到类的私有成员变量时会出错,怎么回事?
  • 疑惑:拷贝构造和附值函数中私有变量的疑惑????
  • 求教:友元访问模板类私有变量
  • 变量分配函数
  • 写ACTIVEX DLL时,如何在回调函数中改变DLL的一些私有变量的值,并触发用户事件?
  • 已经声明是友元,为何在友元函数里面还是不能访问类的私有成员?
  • [除错]类的友元函数真的能访问该类的私有成员吗?
  • 为何VC6下友员函数operator仍不能访问私有成员?编译报错!!
  • 友元函数

关键词

  • 谢谢
  • operator
  • const
  • 问题
  • time
  • include

得分解答快速导航

  • 帖主:waxic

相关链接

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

广告也精彩

反馈

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