您的位置:首页 > 编程语言 > C语言/C++

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

2014-03-03 21:40 447 查看
#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++/。。。(呵呵)

原文链接,感谢原作者
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  VC++编译器bug