#include<iostream> |
02 |
using namespace std; |
03 |
class cylinder |
04 |
{ |
05 |
friend istream operator>>(istream& is,cylinder &cy); |
06 |
public : |
07 |
inline double square() |
08 |
{ return length*(width+height)*2+width*height*2; } |
09 |
inline double volume() |
10 |
{ return length*width*height; } |
11 |
private : |
12 |
double length; |
13 |
double width; |
14 |
double height; |
15 |
}; |
16 |
istream operator>>(istream is,cylinder &cy) |
17 |
{ |
18 |
cout<< "input length:" <<endl; |
19 |
is>>cy.length; |
20 |
cout<< "input width:" <<endl; |
21 |
is>>cy.width; |
22 |
cout<< "input height:" <<endl; |
23 |
is>>cy.height; |
24 |
return is; |
25 |
} |
26 |
int main() |
27 |
{ |
28 |
cylinder first; |
29 |
cin>>first; |
30 |
cout<<first.square()<<endl; |
31 |
cout<<first.volume()<<endl; |
32 |
return 0; |
33 |
} |
這些代碼在VC6.0中不能被編譯通過:提示不能訪問私有成員,沒有這個訪問權限
改成這樣就可以了,代碼如下:
01 |
#include<iostream> |
02 |
using std::cin; |
03 |
using std::endl; using std::cout; |
04 |
using std::ostream; |
05 |
using std::istream; |
06 |
using std::ostream; |
07 |
class cylinder |
08 |
{ |
09 |
friend istream operator>>(istream& is,cylinder &cy); |
10 |
public : |
11 |
inline double square() |
12 |
{ return length*(width+height)*2+width*height*2; } |
13 |
inline double volume() |
14 |
{ return length*width*height; } |
15 |
private : |
16 |
double length; |
17 |
double width; |
18 |
double height; |
19 |
}; |
20 |
istream operator>>(istream is,cylinder &cy) |
21 |
{ |
22 |
cout<< "input length:" <<endl; |
23 |
is>>cy.length; |
24 |
cout<< "input width:" <<endl; |
25 |
is>>cy.width; |
26 |
cout<< "input height:" <<endl; |
27 |
is>>cy.height; |
28 |
return is; |
29 |
} |
30 |
int main() |
31 |
{ |
32 |
cylinder first; |
33 |
cin>>first; |
34 |
cout<<first.square()<<endl; |
35 |
cout<<first.volume()<<endl; |
36 |
return 0; |
37 |
} |
原因:
這據說是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聲明什麼.
下面給出流浪給的解決辦法:
01 |
//方法一: |
02 |
//提前聲明 |
03 |
class cylinder; |
04 |
istream &operator>>(istream& is,cylinder &cy); |
05 |
|
06 |
//方法二: |
07 |
//不用命名空間 或者 像晨雨那樣寫 |
08 |
#include<iostream.h> |
09 |
|
10 |
//方法三: |
11 |
|
12 |
class cylinder |
13 |
{ |
14 |
friend istream &operator>>(istream& is,cylinder &cy) //寫在類裏面 |
15 |
{ |
16 |
cout<< "input length:" <<endl; |
17 |
is>>cy.length; |
18 |
cout<< "input width:" <<endl; |
19 |
is>>cy.width; |
20 |
cout<< "input height:" <<endl; |
21 |
is>>cy.height; |
22 |
return is; |
23 |
|
24 |
} |
25 |
.......... |
26 |
|
27 |
//方法四:打SP6補丁,貌似不好使。。。(呵呵,是貌似也沒用) |
28 |
|
29 |
//方法五:換別的對標準C++支持好的編譯器,如DEV C++/。。。(呵呵) |