注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

数据挖掘

学习数据挖掘

 
 
 

日志

 
 

VC6.0中友元函数无法访问类私有成员的解决办法-------VC6.0的bug  

2012-04-06 23:11:59|  分类: C++基本技巧 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
原文地址:

举个例子:

 

  1. #include<iostream>
  2. using namespace std;
  3. class cylinder
  4. {
  5.     friend istream operator>>(istream& is,cylinder &cy);
  6. public:    
  7.     inline double square()
  8.     {       return length*(width+height)*2+width*height*2;    }
  9.     inline double volume()
  10.     {      return length*width*height;      }
  11. private:
  12.     double length;
  13.     double width;
  14.     double height;
  15. };
  16. istream operator>>(istream is,cylinder &cy)
  17. {
  18.     cout<<"input length:"<<endl;
  19.     is>>cy.length;
  20.     cout<<"input width:"<<endl;
  21.     is>>cy.width;
  22.     cout<<"input height:"<<endl;
  23.     is>>cy.height;
  24.     return is;
  25. }
  26. int main()
  27. {
  28.     cylinder first;
  29.     cin>>first;
  30.     cout<<first.square()<<endl;
  31.     cout<<first.volume()<<endl;
  32.     return 0;
  33. }

这些代码在VC6.0中不能被编译通过:提示不能访问私有成员,没有这个访问权限

改成这样就可以了,代码如下:

 

  1. #include<iostream>
  2. using std::cin;
  3. using std::endl; using std::cout;
  4. using std::ostream;
  5. using std::istream;
  6. using std::ostream;
  7. class cylinder
  8. {
  9.     friend istream operator>>(istream& is,cylinder &cy);
  10. public:    
  11.     inline double square()
  12.     {       return length*(width+height)*2+width*height*2;    }
  13.     inline double volume()
  14.     {      return length*width*height;      }
  15. private:
  16.     double length;
  17.     double width;
  18.     double height;
  19. };
  20. istream operator>>(istream is,cylinder &cy)
  21. {
  22.     cout<<"input length:"<<endl;
  23.     is>>cy.length;
  24.     cout<<"input width:"<<endl;
  25.     is>>cy.width;
  26.     cout<<"input height:"<<endl;
  27.     is>>cy.height;
  28.     return is;
  29. }
  30. int main()
  31. {
  32.     cylinder first;
  33.     cin>>first;
  34.     cout<<first.square()<<endl;
  35.     cout<<first.volume()<<endl;
  36.     return 0;
  37. }

原因:

这据说是VC的一个经典BUG。和namespace也有关. 

只要含有using namespace std; 就会提示友员函数没有访问私有成员的权限。 

解决方法:去掉using namespace std;换成更小的名字空间。 

例如: 
含有#include <string>就要加上using std::string 
含有#include <fstream>就要加上using std::fstream 
含有#include <iostream>就要加上using std::cin; using std::cout; using std::ostream; using std::istream; using std::endl; 等等,需要什么即可通过using声明什么.

 

下面给出流浪给的解决办法:

//方法一:
//提前声明
class cylinder;
istream 
&operator>>(istream& is,cylinder &cy);

//方法二:
//不用命名空间 或者 像晨雨那样写
#include<iostream.h>

 

 

//方法三:

class cylinder
{
    friend istream 
&operator>>(istream& is,cylinder &cy)//写在类里面
    {
        cout
<<"input length:"<<endl;
        
is>>cy.length;
        cout
<<"input width:"<<endl;
        
is>>cy.width;
        cout
<<"input height:"<<endl;
        
is>>cy.height;
        
return is;
        
    }
..........

//方法四:打SP6补丁,貌似不好使。。。(呵呵,是貌似也没用)

 

//方法五:换别的对标准C++支持好的编译器,如DEV C++/。。。(呵呵)


  评论这张
 
阅读(100)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017