廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 4761 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
pkpk0808 手機
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x9
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C/C++] 運算子重載[]時,如何得知等號右邊的值呢??
先敘述一下問題背景
是這樣子的:
我有一個屬於class ABC的obj
class ABC中有類似String class的部分
所以我實作一個[]可以更改obj中的字串的某一個值
例如 obj = 'x'

而在我所定義的[]中
有一些動作是當 obj1 == 'x' 時不必執行的
(ex. obj的字串內容是Hello 那 ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



獻花 x0 回到頂端 [樓 主] From:台灣教育部 | Posted:2005-06-10 18:16 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

obj[1]='e'

這樣子應該是2個運算子的重載([]和=)~
obj[1]的時候是[]的運算~取到值之後再做=的運算~
這個時候,當然知道=右邊是什麼值啦~

看不太懂你要問什麼,不知道這個回答你滿不滿意呢?


獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2005-06-13 10:39 |
夷希微
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
知名人士
級別: 知名人士 該用戶目前不上站
推文 x13 鮮花 x1682
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

說真的~還真的是不太懂您在問什麼呢 ^^" 表情 表情
可以麻煩請先將您的程式碼貼出來好嗎 ^^" 表情 表情


視之不見,名曰夷;
聽之不聞,名曰希;
搏之不得,名曰微。
此三者不可致詰,故混而為一。

[截自老子道德經第十四章]
獻花 x0 回到頂端 [2 樓] From:台灣中華電信 | Posted:2005-06-13 19:41 |
pkpk0808 手機
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x9
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

先回答一下一樓的網友,
其實他只做一次[]重載運算
=不需要重載



複製程式
char& RCString::operator[](int index)
{
       //cout<<strlen(value->data);
       //index: 0 ~ lenth
       if(index<0 || index>strlen(value->data))
              exit(1);
       
       if(value->refCount > 1)
       {
              value->refCount--;
              char* strTemp = new char [strlen(value->data)+1];
              strcpy(strTemp, value->data);
              value = new StringValue (strTemp);
              //if(strTemp!=NULL)
                     delete[] strTemp;
       }

       return value->data[index];
}

會用到[]重載有兩種情形
1. cout<<obj[2];
2. obj[2] = 'x'

第一種情形我們只對obj[2]作讀取動作
第二種情形我們對obj[2]作塗寫動作

但是一般來說,我們並沒有辦法從[]重載中得知
這次的呼叫是要做讀取還是做寫入呢?

於是在Reference Count
我只好把他一律當寫入動作

然後, 問題就發生了
我如果只有讀取(cout<<obj[2];)
卻會產生一整組新的 Reference
這是錯誤的。

問題就是這樣, 應該夠明白了吧

<(_ _)>謝謝各位


獻花 x0 回到頂端 [3 樓] From:台灣教育部 | Posted:2005-06-14 00:03 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

產生一組新的Reference??
這是指多佔用一塊記憶體嗎?
小弟還是不太了解是什麼意思 表情

另外,你是從何得知這個結果的呢?? 表情


獻花 x0 回到頂端 [4 樓] From:台灣中華電信 | Posted:2005-06-14 10:45 |
pkpk0808 手機
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x9
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我來說明一下Reference Count是做什麼的好了

假如果我有n筆資料但這n筆資料的內容是一樣的話
我會佔用 mem * n的空間
這無形中是一種浪費

於是我用另外一個方法指標
將這n筆資料通通指向 同一個地方
並用一個變數refCount紀錄著一共有幾筆資料共用這個地方

如果有另外一筆資料要新增到此處的話
一樣把指標指過來,並且將refCount+1

相反的,如果有資料要變更或是移除的時候
把指標取消,並且refCount-1

如果refCount=0的時候,就將該處的記憶體位址釋放出來避免佔用


我的程式是紀錄字串
那一處的程式碼是
複製程式
s3[1]='x'
因為s3變動到了,所以我必須將s3獨立出來佔用另外一塊記憶體空間
所以原本的refCount-1,並且另外分配一個空間給s3

因為這些動作全部寫在 = 的operator overloading function裡頭
所以,假如我只做了讀取的動作,例如這樣
複製程式
cout<<s3[1]
但是它仍然會去呼叫=的operator overloading
造成另外在開一個記憶體空間給s3使用
而且s3的refCount=1

錯誤就產生啦!!
因為其實s3跟之前的內容是一樣的..但是他卻佔用了另外一組空間

至於哪裡得知結果
將s3的refCount印出來就知道了
或是用debug看也有


獻花 x1 回到頂端 [5 樓] From:台灣教育部 | Posted:2005-06-15 14:21 |
Freelife
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x2 鮮花 x60
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片


而在我所定義的[]中
有一些動作是當 obj1[1] == 'x' 時不必執行的
(ex. obj的字串內容是Hello 那當執行 obj[1]='e'的時候
是不必執行[]運算子重載定義裡面的某些指令)

那問題是這樣子的:
我如何在我的[]運算子重載定義中得知 等號右邊值呢????


就我所知,要取得'='右邊的值,就是要重載=運算子,才能取到這個值。


因為這些動作全部寫在 = 的operator overloading function裡頭
所以,假如我只做了讀取的動作,例如這樣

cout<<s3[1];

但是它仍然會去呼叫=的operator overloading


這個就超出我所學的範圍了,不知道大大是否願意提供完整程式碼出來測試呢?
我也想暸解,要如何達到這個功能 表情

codeboy我看到你有送花,那就是你也會囉 表情
教一下小弟咩 表情


獻花 x0 回到頂端 [6 樓] From:台灣中華電信 | Posted:2005-06-15 17:27 |
pkpk0808 手機
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x1 鮮花 x9
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

呵呵, codeboy跟我說這篇文章很有價值,
等討論結果出來再收精華區,
他也沒說他會不會,會就不要深藏不露了嘛 表情

其實我後來是有找到方法,
跑到圖書部翻了好久翻到的....

不過等我期末考完再po吧XD


獻花 x0 回到頂端 [7 樓] From:台灣教育部 | Posted:2005-06-15 21:53 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.090527 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言