在類別中使用另一個類別的物件 |
答題得分者是:aftcast
|
tfanalysis
一般會員 發表:10 回覆:9 積分:3 註冊:2007-01-07 發送簡訊給我 |
我有一個類別,內含一個陣列,像這樣
[code cpp] class TClass1{ private: double *Array ; public: double& operator[](int i){return Array[i];} ===>本文重點 }; [/code] 至此,在引用"[]"這個operator時沒問題 像這樣, [code cpp] TClass1 *C1 ; C1 = new TClass1; C1[0] = 3.1 ; Edit1->Text = FloatToStr(C1[0]) ; [/code] 但我將TClass1用在TClass2中時,"[]"operator卻不能用了 TClass2長這樣 [code cpp] class TClass2{ public: TClass1 *C1 ; }; [/code] 出問題的部份 [code cpp] TClass2 *C2 ; C2 = new TClass2; Edit1->Text = FloatToStr(C2->C1[0]); ===> "Cannot convert 'TClass1' to 'long double'." [/code] 請問我錯在哪?? 為什麼整個「C2->C1[0]」會被當做TClass1來看?? |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
[code cpp] //--------------------------------------------------------------------------- class TClass1{ private: double *Array; public: TClass1(){Array=new double[10];} ~TClass1(){delete Array;} double& operator[](int i){return Array[i];} }; //--------------------------------------------------------------------------- class TClass2{ public: TClass2(){C1=new TClass1();} ~TClass2(){delete C1;} TClass1 *C1 ; }; //--------------------------------------------------------------------------- [/code] 不知為何??? 將C1->operator[](0) 寫成 C1[0] 編譯時就過不了 我使用的是 BCB6 [code cpp] //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { TClass1 *C1 = new TClass1(); try{ C1->operator[](0) = 3.1 ; Edit1->Text = FloatToStr(C1->operator[](0)) ; } __finally{ delete C1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { TClass2 *C2 ; C2 = new TClass2(); C2->C1->operator[](0) = 3.1; Edit1->Text = FloatToStr(C2->C1->operator[](0)); } //--------------------------------------------------------------------------- [/code] |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
參考參考~~
[code cpp] //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TClass1 *C1 = new TClass1(); try{ (*C1)[0] = 3.1 ; Edit1->Text = FloatToStr((*C1)[0]) ; } __finally{ delete C1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { TClass2 *C2 ; C2 = new TClass2(); C2->C1->operator[](0) = 5.1; TClass1 *X = C2->C1; Edit1->Text = FloatToStr((*X)[0]); delete C2; } //--------------------------------------------------------------------------- [/code]
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2009-12-18 12:31:50, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
啊咧? 都回正確的答案了,還這樣結案喔? @@
難道要說到很清楚才明白嗎? 請問我錯在哪?? 為什麼整個「C2->C1[0]」會被當做TClass1來看?? 因為C2->C1 到這裡為止是傳回 TClass1* (指標)。而指標後面若加了[ ] 就相當於取值,於是 C2->C[0] 就是TClass1 本身( 注意是0) 至於要operator overloading的話,本來就要以物件的直接參考,才可以使用。即: TClass1 c1; double d = c1[0] // 這時候才會使用 [ ] 符號的複載。 當使用 new 出來的物件時,就不能以 [ ] 來做為 符號的複載… 這是超級超級重要的觀念,而了解的人較少… 希望下回見到此篇的人可以有所幫助!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
tfanalysis
一般會員 發表:10 回覆:9 積分:3 註冊:2007-01-07 發送簡訊給我 |
===================引 用 aftcast 文 章=================== 啊咧? 都回正確的答案了,還這樣結案喔? @@ 難道要說到很清楚才明白嗎? 請問我錯在哪?? 為什麼整個「C2->C1[0]」會被當做TClass1來看?? 因為C2->C1 到這裡為止是傳回 TClass1* (指標)。而指標後面若加了[ ] 就相當於取值,於是 C2->C[0] 就是TClass1 本身( 注意是0) 至於要operator overloading的話,本來就要以物件的直接參考,才可以使用。即: TClass1 c1; double d = c1[0] // 這時候才會使用 [ ] 符號的複載。 當使用 new 出來的物件時,就不能以 [ ] 來做為 符號的複載… 這是超級超級重要的觀念,而了解的人較少… 希望下回見到此篇的人可以有所幫助! 感謝您的解答。 我稍微解釋一下之前的誤會。 剛發完問題頭幾天我有上論壇來看,不過之後我找到問題,也解決了,就沒再注意這邊。 有天回到這帖卻看到一則警訊,大意是說,照論壇規矩,我已超過該結案的時間卻沒結案............... 而那時只有jow的一則回應,於是我就按下結案了, 不知是時間差還是我看漏了,我確實沒見到有您的那個回應。 回到問題本身 如上所言,問題確是出在C2->C1 在一開始TClass1 *C1 ; 之後用C1[]存取值讀到的是「C1的*Array陣列」的值 而之後對C2->C1用[]的意義當然就是「C2的C1陣列」,而非我想像中的「C2的C1的*Array陣列」 因此在傳回的型態就錯了,而解決方法正如aftcast所言。 還有第二種解決方法 我後來將C1, C2改寫成虛擬元件(這名詞對嗎??) 然後使用方法就像TStringList->String[], 過程比較麻煩,但使用上很直覺。 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
tfanalysis
一般會員 發表:10 回覆:9 積分:3 註冊:2007-01-07 發送簡訊給我 |
===================引 用 taishyang 文 章=================== 感謝做了良好的示範 ^^ 先前的發言若造成您的困擾在此說聲抱歉 副站長言重了 若是我遇到同樣情況也會不爽吧 而且atfcast兄之後還作了更詳細的原理解釋 其熱心令人敬佩 相信對之後看到本文的新手也有一定的幫助 |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
呵, 我也有學到...
重點是要明確地 Dereference 以下另外改以structure 測試, 以資比較 [code cpp] //--------------------------------------------------------------------------- struct TStruct1{ private: double Array[10]; public: double& operator[](int i){return Array[i];} }; //--------------------------------------------------------------------------- struct TStruct2{ public: TStruct1 C1; }; //--------------------------------------------------------------------------- [/code] [code cpp] //--------------------------------------------------------------------------- void __fastcall TForm1::Button4Click(TObject *Sender) { TStruct1 C1; try{ C1[0] = 3.1 ; Edit1->Text = FloatToStr(C1[0]) ; } __finally{ } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button5Click(TObject *Sender) { TStruct2 C2; C2.C1[0] = 3.2; Edit1->Text = FloatToStr(C2.C1[0]); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button6Click(TObject *Sender) { TStruct1 *C1 = new TStruct1; try{ (*C1)[0] = 3.3 ; Edit1->Text = FloatToStr((*C1)[0]) ; } __finally{ delete C1; } } //--------------------------------------------------------------------------- void __fastcall TForm1::Button7Click(TObject *Sender) { TStruct2 *C2 = new TStruct2; try{ C2->C1[0] = 3.4; Edit1->Text = FloatToStr(C2->C1[0]); } __finally{ delete C2; } } //--------------------------------------------------------------------------- [/code] |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |