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


#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中不能被编译通过:提示不能访问私有成员,没有这个访问权限

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


#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声明什么. 

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

//方法一:

//提前声明

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++/。。。(呵呵) 


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值