重载运算符C ++:错误:没有可行的重载'='

时间:2015-10-08 18:19:07

标签: c++ operator-overloading overloading addition

我的目标是重载'+'运算符,以便我可以组合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;

我不太确定如何将句子加在一起形成一个段落(最终形成并返回一个新故事)。有谁知道如何处理这个问题?

2 个答案:

答案 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中遇到了同样的问题(我想在你的其他课程中也是如此)。

通常,请再次检查您的书籍/教程并查看有关运算符重载的章节。您没有遵循最佳做法。例如,您应该根据+定义+=。当然,一个重要的问题是运算符重载在这里是否真的有用。