2015-10-08 3 views
-2

Моя цель перегрузить оператор '+', чтобы я мог объединить объект Paragraph и объект Story. Эта функция должна вернуть новый объект 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; 
} 

Однако, когда я запускаю весь мой код (Объект Story должен иметь пункт. Объект пункт должен иметь предложение. Объект Приговор должен иметь слово и т.д.), я получаю эту ошибку : не

ошибка: не жизнеспособны перегружен '='

Это происходит, когда я пытаюсь сделать следующую строку:

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/copy constructor/copy – Barry

+1

обязан быть ошибкой компилятора, учитывая, что код верен :-) – pm100

0
Paragraph operator+(const Sentence& sent); 

Это говорит оператор такого, что добавление двух Sentence сек результатов в Paragraph.

paragraph.sentence = this->sentence + paraSentence; 

Правая часть задания использует оператор сверху, так что вы пытаетесь Ассинг в Paragraph к Sentence, как если бы вы написали:

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

Проблема заключается в том, что у вас есть не определено присвоение от Paragraph в Sentence. Вы можете просто добавить его в Sentence, конечно:

Sentence& operator=(const Paragraph& para); 

Но как бы вы реализовать его? Может ли абзац логически быть преобразован в одно предложение? Это решение не будет работать.

Альтернативное решение состоит в изменении соответствующего operator+ в Sentence, чтобы возвращать 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 (и я думаю, что и в других классах).


Как правило, проверьте свои книги/учебные пособия и просмотрите главу о перегрузке оператора. Вы не следуете лучшим практикам. Например, вы должны определить + в терминах +=. И, конечно, важный вопрос заключается в том, действительно ли операционная перегрузка является полезной здесь или нет.

Смежные вопросы