全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1060
推到 Plurk!
推到 Facebook!

元件的屬性含有reference參數時的讀寫問題

答題得分者是:jow
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-03-24 17:45:53 IP:220.130.xxx.xxx 未訂閱
請問各位前輩一個困擾多天問題

小弟在元件中宣告一個structure, TPoint Fp[20]
此時會有 TPoint 的reference,TPoint[].x、TPoint[].y

方法1:可以正常的使用p[].x, p[].y存取
[code cpp]
__property TPoint* p = { read = Fp, write = Fp }
[/code]

方法2:可以正常的使用px[], py[]存取
[code cpp]
__property int px[int index] = { read = ReadFpX, write = WriteFpX }

__property int py[int index] = { read = ReadFpY, write = WriteFpY }
int ReadFpX(int Index)
{
return Fp[index].x;
}
void WriteFpX(int index, int value)
{
Fp[index].x = value;
}
[/code]
方法3:無法使用p[].x, p[].y, p[]"存", 可以"取" (存會之敗)
[code cpp]
__property TPoint p[int index] = { read = ReadFp, write = WriteFp }
TPoint ReadFp(int Index)
{
return Fp[index];
}
void WriteFp(int index, TPoint value)
{
Fp[index] = value;
}
[/code]

問題就在於
方法3
,雖然可以compiler,但是只能讀取,無法寫入reference值
方法2,會造成sub-function一堆,維護成本過高(因為我自訂的my-struture比起TPoint複雜很多)
方法1,直接存取有風險(需要在Write/Read部分寫額外判斷)

不知哪位大俠能夠指點一下迷津 m(_ _)m
編輯記錄
daldal 重新編輯於 2008-03-24 17:48:25, 註解 錯字‧
jow
尊榮會員


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-03-25 13:43:27 IP:210.66.xxx.xxx 訂閱

以下只談個人看法, 沒有實作...
(1)
方法一:
[code cpp]
__property TPoint* p = { read = Fp, write = Fp }
[/code]
其實與直接存取TPoint Fp[20]是完全相同的,
應該可以正常存取陣列中的數值
只是以資料封裝的角度來看,程式碼應該寫成
[code cpp]
__property TPoint* p = { read = Fp}
[/code]
表示TPoint Fp[20]所配記憶體的位址,是唯讀的
試想以下的動作,會造成什麼結果?
[code cpp]
TYourClass *O = new TYourClass();
O->p = new TPoint[10];
[/code]
記憶體有可能會被重新配置了,或出現該記憶體位址
無法寫入的Exception(因沒有實作,無法確定實際狀況)

(2)
方法二:
[code cpp]
__property int px[int index] = { read = ReadFpX, write = WriteFpX }
__property int py[int index] = { read = ReadFpY, write = WriteFpY }
[/code]
這是很正規的資料封裝的寫法...
(3)
方法三:

建議寫成只存取單一 TPoint的指標
[code cpp]
__property TPoint* p[int index] = { read = get_p, write = write_p }

TPoint get_p(int Index)
{
return &Fp[index]; //傳回第Index筆TPoint的位址
}

void WriteFp(int index, TPoint* value)
{
Fp[index] = *value; //將value內含值,指定給第index筆的 TPoint
}

[/code]

個人看法,僅供參考...
daldal
高階會員


發表:6
回覆:102
積分:226
註冊:2007-06-18

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-03-25 15:22:50 IP:61.219.xxx.xxx 未訂閱
恩恩,的確是這樣子沒錯,甘溫啊! 

另外小弟實做了一下您的第三種方法,傳回p結構使用方式可以是
p[0][j].x p[0][j].y 或是 p[i]->x p[i]->y 兩種形式
感覺有點怪怪的說 ^_^||
(主要是怕使用者誤會使用方式,不過這個方法的確可以寫入個別reference )


不過既然第二種方法是標準解的話,還是多打一些code好了
給每個reference參數個別寫R/W,四十幾個簡單的sub-function, 嚇不死我的
系統時間:2024-05-03 5:51:34
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!