線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1467
推到 Plurk!
推到 Facebook!

在類別中使用另一個類別的物件

答題得分者是:aftcast
tfanalysis
一般會員


發表:10
回覆:9
積分:3
註冊:2007-01-07

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-12-13 02:25:57 IP:77.246.xxx.xxx 訂閱
我有一個類別,內含一個陣列,像這樣

[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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-12-15 13:09:22 IP:211.74.xxx.xxx 未訂閱

[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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-12-18 12:28:51 IP:210.64.xxx.xxx 訂閱
參考參考~~


[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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-12-18 21:55:45 IP:59.115.xxx.xxx 訂閱
啊咧?  都回正確的答案了,還這樣結案喔? @@

難道要說到很清楚才明白嗎?

請問我錯在哪?? 為什麼整個「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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-12-21 14:26:10 IP:122.116.xxx.xxx 訂閱
前輩,這裡是作業區,別期待發問者能有多好的回應,不然您會很傷心的^^
希望不要因為這文章澆熄您的熱情,請繼續燃燒^^
tfanalysis
一般會員


發表:10
回覆:9
積分:3
註冊:2007-01-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-12-21 18:38:40 IP:195.221.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-12-21 18:53:13 IP:122.116.xxx.xxx 訂閱
感謝tfanalysis,做了良好的示範 ^^
先前的發言若造成您的困擾在此說聲抱歉
tfanalysis
一般會員


發表:10
回覆:9
積分:3
註冊:2007-01-07

發送簡訊給我
jow
尊榮會員


發表:66
回覆:751
積分:1253
註冊:2002-03-13

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-12-23 19:21:29 IP:123.193.xxx.xxx 未訂閱
呵, 我也有學到...

重點是要明確地 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]

系統時間:2024-04-27 12:54:02
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!