我的目标是重载'+'运算符,以便我可以组合Paragraph对象和Story对象。此函数应返回一个新的Story对象,其中段落附加到开头。
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对象应该有一个单词等。),我得到这个错误:
错误:没有可行的重载'='
当我尝试执行以下行时会发生这种情况:
paragraph.sentence = this->sentence + paraSentence;
我不太确定如何将句子加在一起形成一个段落(最终形成并返回一个新故事)。有谁知道如何处理这个问题?
答案 0 :(得分:3)
you can assume that all my classes are defined properly
这是错误的假设,会导致您出现此错误。
Sentence
类显然没有或错误operator=
和/或复制构造函数已定义
答案 1 :(得分:0)
Paragraph operator+(const Sentence& sent);
这声明了一个运算符,以便在Sentence
中添加两个Paragraph
s。
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
中遇到了同样的问题(我想在你的其他课程中也是如此)。
通常,请再次检查您的书籍/教程并查看有关运算符重载的章节。您没有遵循最佳做法。例如,您应该根据+
定义+=
。当然,一个重要的问题是运算符重载在这里是否真的有用。