您的位置:首页 > 其它

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

2014-01-11 23:02 411 查看
#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++/。。。(呵呵)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: