友元函数 无法访问 类私有成员

#include<iostream> 
02using namespace std; 
03class cylinder 
04
05    friend istream operator>>(istream& is,cylinder &cy); 
06public:     
07    inline double square() 
08    {       return length*(width+height)*2+width*height*2;    } 
09    inline double volume() 
10    {      return length*width*height;      } 
11private
12    double length; 
13    double width; 
14    double height; 
15}; 
16istream 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
26int main() 
27
28    cylinder first; 
29    cin>>first; 
30    cout<<first.square()<<endl; 
31    cout<<first.volume()<<endl; 
32    return 0; 
33}

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

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

01#include<iostream> 
02using std::cin; 
03using std::endl; using std::cout; 
04using std::ostream; 
05using std::istream; 
06using std::ostream; 
07class cylinder 
08
09    friend istream operator>>(istream& is,cylinder &cy); 
10public:     
11    inline double square() 
12    {       return length*(width+height)*2+width*height*2;    } 
13    inline double volume() 
14    {      return length*width*height;      } 
15private
16    double length; 
17    double width; 
18    double height; 
19}; 
20istream 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
30int 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声明什么.

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

 

01//方法一:
02//提前声明
03class cylinder;
04istream &operator>>(istream& is,cylinder &cy);
05  
06//方法二:
07//不用命名空间 或者 像晨雨那样写
08#include<iostream.h>
09  
10//方法三:
11  
12class cylinder
13{
14    friend istream &operator>>(istream& is,cylinder &cy)//写在类里面
15    {
16        cout<<"input length:"<<endl;
17        is>>cy.length;
18        cout<<"input width:"<<endl;
19        is>>cy.width;
20        cout<<"input height:"<<endl;
21        is>>cy.height;
22        return is;
23          
24    }
25..........
26  
27//方法四:打SP6补丁,貌似不好使。。。(呵呵,是貌似也没用)
28   
29//方法五:换别的对标准C++支持好的编译器,如DEV C++/。。。(呵呵)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值