2015-10-08 81 views
-2

我的目標是重載'+'運算符,以便我可以組合Paragraph對象和Story對象。此功能應該返回一個新的故事對象與附加到開頭的段落。重載運算符C++:錯誤:沒有可行的重載'='

Story Paragraph::operator+(const Story& story) { 
    Paragraph paragraph; 
    Story stry; 

    Paragraph storyPara = story.paragraph; 
    Sentence paraSentence = storyPara.sentence; 

    paragraph.sentence = this->sentence + paraSentence; 
    stry.paragraph = paragraph; 

    return stry; 
} 

然而,當我跑我的所有代碼(A故事的對象應該有一個段落。段落對象應該有一個句子,一個句子對象應該有一個字,等),我得到這個錯誤:

錯誤:沒有合適的重載 '='

當我嘗試做下面的行會發生此:

paragraph.sentence = this->sentence + paraSentence; 

我不太確定如何將句子加在一起組成一個段落(最終形成&返回一個新的故事)。有誰知道如何解決這個問題?

+8

_「你可以假設我所有的類都被正確定義了」_如果這是真的,你就不會有錯誤... –

+0

'Sentence'類是否有複製構造函數或重載的'='運算符? – yizzlez

+0

什麼問題?我們看不到任何相關的代碼。出示您在過去幾天內一直在調試該問題的[最小測試用例](http://stackoverflow.com/help/mcve)。 –

回答

3
you can assume that all my classes are defined properly 

這是錯誤的假設,導致你這個錯誤。 Sentence類顯然已經沒什麼錯operator=和/或拷貝構造函數定義

+0

或者錯誤的'operator ='。 –

+0

s /拷貝構造函數/拷貝賦值運算符 – Barry

+1

綁定是一個編譯器錯誤,假設代碼是正確的:-) – pm100

0
Paragraph operator+(const Sentence& sent); 

此聲明的操作,從而增加了兩個Sentence S IN一個Paragraph結果。

paragraph.sentence = this->sentence + paraSentence; 

分配的右邊部分使用從上面的操作,讓您嘗試assing一個ParagraphSentence,因爲如果你這樣寫:

Paragraph additionResult = this->sentence + paraSentence; 
paragraph.sentence = additionResult; 

的問題是,你有沒有在Sentence中定義Paragraph的轉讓。你可以只將它添加到Sentence,當然:

Sentence& operator=(const Paragraph& para); 

但你怎麼會實施呢?邏輯上可以將一個段落轉換爲單個句子嗎?這個解決方案不會真的起作用。

另一種解決方案是改變對應於Sentenceoperator+返回一個,而不是一個段落Sentence

class Sentence { 
    public: 
     Sentence();  
     ~Sentence();   
     void show(); 
     Sentence operator+(const Sentence& sent); // <-- now returns a Sentence 
     Paragraph operator+(const Paragraph& paragraph); 
     Sentence operator+(const Word& word); 

     Word word;    

}; 

當添加兩個Sentence小號回報Sentence,則相加的結果也可以被分配到Sentence,因爲來自相同類型的拷貝分配是由編譯器自動生成的(除非你明確地使用delete)。

但是這提出了自己的問題,因爲如何將兩個句子合併爲一個?

真正的問題或許可以在這一行中找到:

Sentence sentence;  // Sentence in Paragraph 

您的類定義有效地說,一個段落總是由只有一個句子。這不可能是正確的。成員變量應該是std::vector<Sentence>類型,以表示一個段落由0到n句子組成的意圖。一旦你改變了成員變量,重寫所有的操作符實現來說明新的情況。

當然,你在Sentence也有同樣的問題(我猜你也在其他課上)。


一般來說,請再次檢查您的書籍/教程並查看有關操作員重載的章節。您沒有遵循最佳做法。例如,您應該根據+=定義+。當然,一個重要的問題是運算符重載是否真的有用。