所以我有一个“句子”,#包括“Word”。
句子是单词的链接列表。
我的作业声明我必须重载“operator +”以便
Sentence s = "dog jumped.";
Word w = "The";
W+s; //should return a new sentence that says "The dog jumped high."
请记住,我必须重载operator +。这就是我的评分
然而,因为,Sentence包括Word,它尚未定义。我会收到错误
return type 'class Sentence' is incomplete
和 无效使用不完整类型'const class Sentence'
这是我的重载代码
class Sentence; //forward declaration
Sentence Word::operator+(const Sentence &sentence) const{
Sentence *s = new Sentence(sentence.getCopy()); //make a new sentence that's a copy of the parameter
Word *w = new Word;
Sentence::node *l = new Sentence::node; //make new linked list node
(*(l->w)) = (*w); //Set word of node
l->next = (*s).getFirs(); // set new node to point to first node of the sentence object
(*s).setFirs(l); // point first pointer to the new node
return *s;
}
我还尝试了一种单独的方法,将操作符重载到看起来像这个
的类之外Sentence operator+(const Word &word, const Sentence &sentence);
导致错误,说明它被多次定义
答案 0 :(得分:0)
您收到此错误的原因是,当您转发声明Sentence
时,您不向编译器提供生成调用前向声明类的方法或返回的代码所需的信息它的价值。使用前向声明的类所能做的就是指向它。对于其他所有内容,必须提供完整的定义。
在Word
类的实现文件中包含带有Sentence
类定义的头文件。这将解决这个编译问题。
就实施而言,这条线看起来效率低下:
Sentence *s = new Sentence(sentence.getCopy());
您正在通过将其传递给复制构造函数来复制已经是副本的句子。这两种选择也应该有效,没有不必要的复制:
Sentence *s = &sentence.getCopy();
或
Sentence *s = new Sentence(sentence);
当然,这不会消除由于在不调用delete
的情况下返回动态分配对象的副本而导致的内存泄漏。
这样可以避免内存泄漏问题:
Sentence s(sentence);