作者Nestarneal (涅斯)
看板C_and_CPP
標題[問題] 多載 operator+
時間Fri Nov 11 12:25:58 2011
開發平台(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 以後如果我把 str1 的 m_str delete掉會出錯。
不過事實上應該不會有錯。
接著我把敘述 str1=str2 改為 str1->operator=(str2)以後執行就正確了。
所以我認為是 operator= 的部分出問題。
接著我為了測試,把 cout << "test!!"; 放到了 operator= 的函式中,
結果發現當我使用 str1=str2 的敘述,程式沒有跑我多載的函式,
而當我使用 str1->operator=(str2) 的敘述,程式才真正有跑。
不過這樣我就有點搞不懂。
ref class 理應沒有 default assignment operator
如果用 str1=str2 沒有跑我多載的函式,那程式到底是做了什麼?
因為事實上如果在這行敘述以後把內容 print 出來,
確實 str2 的值有給 str1了,只是是怎麼給就不清楚了...
而且為什麼程式沒有跑我多載的函式?
我也有做其他的運算式多載:
static StringOperator^ operator+(StringOperator^ str1, double d);
static StringOperator^ operator-(StringOperator^ str1,
StringOperator^ str2);
這些都沒有問題,就只有 operator= 的部分出問題。
請問這是怎麼了...?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.38.22.66
※ 編輯: Nestarneal 來自: 114.38.22.66 (11/11 12:28)
推 shadow0326:多載的是StringOperator, 不是ptr to StringOperator 11/11 13:40
→ shadow0326:str1=str2 就只是讓兩個pointer指到同一位址而已 11/11 13:42
→ shadow0326:突然想到CLI的handle和一般的ptr不太一樣, 所以上面講 11/11 13:51
→ shadow0326:的不太對...不過大體上問題的方向應該是相同的 11/11 13:52
→ Nestarneal:str1=str2的敘述跟str1->operator=(str2)的敘述一樣 11/11 14:20
→ Nestarneal:所以多載operator=不是就可以了嗎? 11/11 14:21
→ Nestarneal:我在函式有 new 一塊新記憶體空間把資料複製過來 11/11 14:21
→ Nestarneal:指向不是不同嗎? 11/11 14:21
推 LPH66:str1 是個 StringOperator^ 而多載的是 StringOperator 11/11 15:22