作者shadow0326 (非議)
看板C_and_CPP
標題Re: [問題] 多載 operator+
時間Fri Nov 11 15:01:09 2011
首先我得說,我對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
推 Nestarneal:原來如此...看來我的盲點在於我一直把handle直接想成 11/11 15:20
→ Nestarneal:是物件本身... 11/11 15:20
→ Nestarneal:除了這個以外全都回傳handle是因為除了這個以外都沒 11/11 15:21
→ Nestarneal:範例,所以我覺得應該要這樣做。然後=有範例就跟著照做 11/11 15:22
→ Nestarneal:沒想到反而出問題... 11/11 15:22
→ Nestarneal:感謝shadow大詳細的解釋 :) 11/11 15:22
推 cwyuptt:請問這個 ^ 當成是 handle 解釋是 .NET 特有的東西嗎? 11/11 20:13
推 Nestarneal:最近剛學。老師是說可以把它當成會自動 11/11 20:24
→ Nestarneal:garbage collection的pointer就好了 11/11 20:24
→ Nestarneal:純C++沒有handle 11/11 20:25
推 cwyuptt:感謝N大 :) 11/11 21:01