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

举个例子:

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

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

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

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

原因:

这据说是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声明什么.

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

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//方法一:
//提前声明
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++/。。。(呵呵)
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值