举个例子:
-
#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++/。。。