友元函數 無法訪問 類私有成員

#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++/。。。(呵呵)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章