2015-04-27 88 views
0

我想用自定義字符串和定義類建立一個自定義詞典類。當試圖超載>>(輸入)時,我會遇到某種問題。當函數結束時,發送給它的字典不會改變。附加代碼: 這是重載:C++重載運算符>>(輸入)不改變原始

istream& operator>>(istream& ip, Dictionary& var) { 
    Definition temp; 
    ip >> temp; 
    var += temp; 
    return ip; 
} 

和其他一些功能,它使用:

Dictionary& Dictionary::operator+=(Definition& input) { 
    if (!checkCopy(input)) 
    { 
     Definition** temp; 
     temp = new Definition*[numWords + 1]; 
     for (int i = 0; i < numWords; i++) 
     { 
      temp[i] = book[i]; 
     } 
     numWords++; 
     temp[numWords - 1] = &input; 
     delete[] book; 
     book = temp; 
    } 
    return *this; 
} 
Dictionary::Dictionary(Dictionary& input) { 
    *this = input; 
} 
Dictionary& Dictionary::operator=(Dictionary& input) { 
    if (numWords != 0) 
     delete[] book; 
    book = new Definition*[input.numWords]; 
    for (int i = 0; i < input.numWords; i++) 
    { 
     *this += *input.book[i]; 
    } 
    return *this; 
} 

和類本身:

class Dictionary 
{ 
private: 
    int numWords = 0; 
    Definition** book; 
public: 
    Dictionary(); 
    ~Dictionary(); 
    Dictionary(Dictionary&); 
    bool operator==(Dictionary&) const; 
    Dictionary& operator=(Definition&); 
    Dictionary& operator=(Dictionary&); 
    friend ostream& operator<<(ostream&, const Dictionary&); 
    friend istream& operator>>(istream&, Dictionary&); 
    Dictionary& operator-=(int); 
    Dictionary& operator+=(Definition&); 
    bool checkCopy(Definition&); 
    Definition& operator[](int); //left side brackets for input 
    Definition operator[](int) const; //right side brackets for output 
}; 

編輯:這也是超載操作員定義輸入:

istream& operator>>(istream& ip, Definition& var) 
{ 
    cout << "Please enter a word: " << endl; 
    ip >> var.word; 
    cout << "Please enter the number of definitions for this word: " << endl; 
    int idx; 
    cin >> idx; 
    while (idx<0) 
    { 
     cout << "Error: number of definitions not possible. Please Try again: " << endl; 
     cin.clear(); 
     cin.ignore(INT_MAX, '\n'); 
     cin >> idx; 
    } 
    cin.clear(); 
    cin.ignore(INT_MAX, '\n'); 
    String* temp = new String[idx]; 
    for (int i = 0; i < idx; i++) { 
     cout << "Please enter the " << i + 1 << "th definition: " << endl; 
     cin >> temp[i]; 
     var += temp[i]; 
    } 
    var.sortDefinition(); 
    return ip; 
} 

確實需要幫助。

+2

流媒體運營商不應該是互動的。 – molbdnilo

回答

1

你應該堅持使用std::vector和其他集合類型,而不是像指針那樣雜耍,new/delete就像你在這裏做的那樣。

在你operator+=功能你複製一個臨時變量的地址到你的數組:

temp[numWords - 1] = &input; 

一旦調用函數operator>>結束,這個指針低於毫無價值,因爲原來的對象(Definition temp;)不再存在。因此該代碼的行爲是未定義的!

可能解決這個定義副本c'tor爲Definition,然後改變上述行來:

*temp[numWords - 1] = input; 
在你的賦值運算符

而且你正在做使用operator+=功能。但是,您的numWords成員此時沒有適當設置,因此operator+=可能會做錯誤的事情。因此,一個行添加到賦值運算符是這樣的:

if (numWords != 0) 
{ 
    delete[] book; 
    numWords = 0; // add this line 
} 
+0

我很樂意使用std :: vector,但是這是一個課程項目,所以我不能使用它。任何解決方案其他解決方案 –

0

有2個問題:

什麼亞歷山大說,關於臨時變量。它改爲:

Dictionary& Dictionary::operator+=(Definition& input) { 
    if (!checkCopy(input)) 
    { 
     Definition** temp; 
     temp = new Definition*[numWords + 1]; 
     temp[0] = new Definition[numWords]; 
     for (int i = 0; i < numWords; i++) 
     { 
      temp[i] = book[i]; 
     } 
     temp[0][numWords] = input; 
     delete[] book; 
     book = temp; 
     numWords++; 
    } 
    return *this; 
} 

第二個原因是在定義類,當我試圖訪問,這不是由於雙指針創建的對象的定義數:

Definition** temp; 
temp = new Definition*[numWords + 1]; 

所以我改變了它,所以它不會訪問它,但首先建立它。

感謝您的幫助亞歷山大!