2011-12-08 120 views
3

我目前正試圖改寫爲一類+ =運算符我寫的叫了mystring:運算符重載問題

MyString& operator+=(MyString& s1, const MyString& s2) 
{ 

    int newStringLength = s1.length + s2.length; 
    char* newStorage = new char[newStringLength + 1]; 

    strcpy(newStorage, s1.data); 

    strcpy(newStorage + s1.length, s2.data); 
    delete[] s1.data; 

    s1.length = newStringLength; 
    s1.data = newStorage; 

    return s1; 

} 

MyString operator+(const MyString& s1, const MyString& s2) 
{ 

    MyString temp; 
    delete[] temp.data; 

    temp.length = s1.length; 
    temp.data = new char[temp.length+1]; 

    strcpy(temp.data, s1.data); 
    temp+=s2; 

    return temp; 

} 

哪裏長度字符串和數據的長度是存儲在字符*格式的字符串。

程序工作正常,當我嘗試做這樣的事情:

MyString test1 = "hi"; 
MyString test2 = "to"; 

test1 += test2; 

但是,當我嘗試像不起作用:

基本上當我開始混合+ =和+中交替的方式它不起作用。這裏是彙編錯誤:

testoutput.cpp:26: error: no match for ‘operator+=’ in ‘operator+(const MyString&, const MyString&)(((const MyString&)((const MyString*)(& test1)))) += "you"’ 
mystring.h:45: note: candidates are: MyString& operator+=(MyString&, const MyString&) 

有沒有人有任何想法我可以更改我的代碼,以實現此功能?

+0

什麼是's1.data'初始化爲默認構造函數(這就是你用'MyString test'調用的內容? – matthias

+0

data = new char [1]; data [0] ='\ 0' ; 長度= 0; – KWJ2104

+0

你能後的完整源爲MyString的類 – Ternary

回答

3

以這種方式混合++=沒有任何意義。我真的不知道你的意圖的行爲是什麼,但如果你想嵌套+=適用於test1,你將不得不使用括號:

test += test2 + (test1 += "you"); 

這是不是與你的賦值運算符的一個問題,但運算符優先於語言。如果你想用int代替MyString,你會遇到同樣的問題。

的的++=運營商precedence and associativity導致表達而不圓括號這樣解釋:

test += ((test2 + test1) += "you"); 

這將嘗試分配到test2 + test1,但那是不可能的(你只能分配給變量)。這個運算符的優先級不能被改變,沒有括號,表達式總會被這樣解釋。

+0

你能說明運算符的優先級如何讓我無法在沒有括號的情況下進行編譯嗎?我嘗試了你的方法,它確實使它工作。有沒有辦法讓它在沒有hte括號的情況下工作? – KWJ2104

+0

此外,爲了迴應您的意見,對於在OP上沒有更具體的意見感到抱歉,我在前一段時間編輯了我編寫的錯誤消息。 – KWJ2104

+0

我添加了一些更多的細節... – sth

0

你的錯誤是在這裏:

test += test2 + test1 += "you"; 

程序會從 '測試2 + test1的' 創建臨時對象,並調用operator + =()它。問題是,在一個表達式中有2個operator + =調用,並且未定義哪一個將首先調用。所以operator + =(TemporaryObject,MyString(「you」))的結果可能會丟失;

爲了防止這種情況,你應該聲明運營商+這樣的:

const MyString operator+(const MyString& s1, const MyString& s2) 

如果你這樣做,編譯器將能夠如果它絆倒在不可預知的結果,這樣的表情來發出錯誤信號;

編輯:

現在,我們有編譯器輸出,我看到,編譯器足夠聰明地看到,()從運營商+創建的對象是暫時的。所以,你必須要做出2倍的表達,而不是1:

test += test2 + test1; 
test += "you"; 

但我仍然建議從您的運營商+返回const對象();

+0

但是,如果操作符具有相同的優先級,它們是否按照它們出現的順序調用?例如,爲什麼如果test1 + test2 + test3或某些東西被調用,這不會搞亂,是不是必須先判斷哪個+應該被調用?我可能會很困惑。另外我嘗試添加const,但我的代碼仍然不能編譯,並給出相同的錯誤。 – KWJ2104

+0

根據Stroustrup的「The C++ Programming Language」「表達式中子表達式的評估順序未定義」。不能參考標準 –

+0

小增加:你不應該搞亂優先級,相關性和評估順序。這裏給出一個很好的解釋:[link](http://stackoverflow.com/questions/5473107/operator-precedence-vs-order-of-evaluation) –