作者pziyout (pziyout)
看板C_and_CPP
標題[問題] 無法解釋的簡單類別問題
時間Tue Mar 6 08:06:56 2012
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
Linux : gcc 版本 4.1.2 20070925 (Red Hat 4.1.2-33)
問題(Question):
以下的類別程式不曉得如何解釋,請大家提供看法。
預期的正確結果(Expected Output):
據我的認知,兩個輸出式應該都輸出 0 ,但
第一個輸出在編譯時就會有問題,以下為編譯錯誤訊息:
error: request for member 'fval' in 'a', which is of non-class type 'AA ()(BB
(*)())'
程式碼(Code):(請善用置底文網頁, 記得排版)
class BB {
private :
int y ;
public :
BB( int s = 0 ) : y(s) {}
double val() const { return y ; }
};
class AA {
private :
BB fn ;
public :
AA( const BB& h ) : fn(h) { }
double fval() const { return fn.val() ; }
};
int main() {
AA a(BB()) ;
cout << a.fval() << endl ; // 此行編譯錯誤
AA b(BB(0));
cout << b.fval() << endl ;
return 0 ;
}
--
※ 編輯: pziyout 來自: 140.115.25.21 (03/06 08:15)
→ james732:AA a(*(new BB) ; 可以解決 (不過是爛方式XD) 03/06 08:21
→ pziyout:將 AA 的建構函式改為 AA( BB h ) : fn(h) {} 也是不行 03/06 09:01
→ stimim:AA a(BB()) 是一個 function prototype 的宣告 03/06 09:42
→ angleevil:BB()被當成函式,BB (*)()<--.不過c++03以後,這個好像可 03/06 09:55
→ angleevil:以 03/06 09:55
推 shadow0326:宣告改成 AA a((BB())); 03/06 10:17
→ shadow0326:你原本的寫法會被解讀為宣告一個函式a, 回傳值為AA並帶 03/06 10:20
→ shadow0326:一個未命名參數,參數型態是回傳B且不太參數的函式指標 03/06 10:21
→ shadow0326: 帶 03/06 10:21
→ angleevil:有神快拜<(__)> 03/06 10:29
→ shadow0326: 跟著拜<(__)> 03/06 10:54
推 james732:原來多一個括號就可以解決了 03/06 11:20
→ pziyout:謝謝,我想改以 AA a = BB() ; 就不會有分辨不清的問題 03/06 13:25