举个例子:
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;
}
|