Re: [問題] 多載 operator+

看板C_and_CPP作者 (非議)時間12年前 (2011/11/11 15:01), 編輯推噓4(407)
留言11則, 2人參與, 最新討論串2/2 (看更多)
首先我得說,我對C++/CLI的了解非常粗淺 就我的認知,C++/CLI handle算是一種 "pointer to info of the object" 如果有錯誤還請各位不吝指正 ※ 引述《Nestarneal (涅斯)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : MS Visual Studio : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : .NET framework 4.0 : 問題(Question): : 程式碼:http://pastie.org/2845419 : 我在 main 有宣告兩個物件,分別是 : StringOperator^ str1 = gcnew StringOperator("abcd"); : StringOperator^ str2 = gcnew StringOperator("abcd"); str1 和 str2 的型態都是 StringOperator^ 注意有個^ 表示它們是handle,也就是指向info of StringOperator的pointer : 執行 str1=str2 以後如果我把 str1 的 m_str delete掉會出錯。 : 不過事實上應該不會有錯。 所以 str1 = str2 的意思就是令str1和str2指向一樣的位址 這裡的等號是兩個pointer(或handle)之間的operator (StringOperator^ 和 StringOperator^) 而你實作的等號是pointer和refference之間的operator (StringOperator% 和 StringOperator^) 所以str1 = str2之後,delete str1->m_str 就等同於 delete str2->m_str 如果str2這時還有被參考到,當然就error了 : 接著我把敘述 str1=str2 改為 str1->operator=(str2)以後執行就正確了。 : 所以我認為是 operator= 的部分出問題。 : 接著我為了測試,把 cout << "test!!"; 放到了 operator= 的函式中, : 結果發現當我使用 str1=str2 的敘述,程式沒有跑我多載的函式, : 而當我使用 str1->operator=(str2) 的敘述,程式才真正有跑。 str1->operator=(str2) 就是跑你實作的 operator 了 : 不過這樣我就有點搞不懂。 : ref class 理應沒有 default assignment operator : 如果用 str1=str2 沒有跑我多載的函式,那程式到底是做了什麼? 如同前述,就是做兩個 pointer (或handle)之間的賦值運算而已 另外我不是很確定 CLI 會不會有 default assignment operator 不過一般C++是有的 (member-wise copy) : 因為事實上如果在這行敘述以後把內容 print 出來, : 確實 str2 的值有給 str1了,只是是怎麼給就不清楚了... : 而且為什麼程式沒有跑我多載的函式? : 我也有做其他的運算式多載: : static StringOperator^ operator+(StringOperator^ str1, double d); : static StringOperator^ operator-(StringOperator^ str1, : StringOperator^ str2); : 這些都沒有問題,就只有 operator= 的部分出問題。 : 請問這是怎麼了...? 這些回傳都是 StringOperator^ 用型態為StringOperator^的變數去接當然OK 至於會不會跑出你想像的結果我就不知道了,要看你的實作 為什麼要寫成有的operator回傳handle,有的回傳refference呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.65.124

11/11 15:20, , 1F
原來如此...看來我的盲點在於我一直把handle直接想成
11/11 15:20, 1F

11/11 15:20, , 2F
是物件本身...
11/11 15:20, 2F

11/11 15:21, , 3F
除了這個以外全都回傳handle是因為除了這個以外都沒
11/11 15:21, 3F

11/11 15:22, , 4F
範例,所以我覺得應該要這樣做。然後=有範例就跟著照做
11/11 15:22, 4F

11/11 15:22, , 5F
沒想到反而出問題...
11/11 15:22, 5F

11/11 15:22, , 6F
感謝shadow大詳細的解釋 :)
11/11 15:22, 6F

11/11 20:13, , 7F
請問這個 ^ 當成是 handle 解釋是 .NET 特有的東西嗎?
11/11 20:13, 7F

11/11 20:24, , 8F
最近剛學。老師是說可以把它當成會自動
11/11 20:24, 8F

11/11 20:24, , 9F
garbage collection的pointer就好了
11/11 20:24, 9F

11/11 20:25, , 10F
純C++沒有handle
11/11 20:25, 10F

11/11 21:01, , 11F
感謝N大 :)
11/11 21:01, 11F
文章代碼(AID): #1ElCXFwK (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1ElCXFwK (C_and_CPP)