2014-10-19 69 views
0

所以我有一个类“Sentence”#包含“单词”。没有定义类函数的返回类型

句子是单词的链接列表。

我的任务规定,我不得不超负荷“运营商+”,使

Sentence s = "dog jumped."; 
Word w = "The"; 

W+s; //should return a new sentence that says "The dog jumped high." 

请记住,我必须重载operator +。这就是我正在分级

但是,因为,句子包括单词,它尚未定义。我会得到一个错误

return type 'class Sentence' is incomplete 

和 无效使用不完全类型“常量类句子”的

这里是我的过载码

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

你试图返回时只能向前声明的类型。假设你是编译器,用户说将来会有Sentance类,所以你只知道那一件事,然后他试图返回它的实例。你真的不知道大小是多少,所以临时分配多少空间等等。您将不得不拆分此代码,以便操作员+位于可以看到句子和词的定义的位置。 – Creris 2014-10-19 18:11:18

+1

在此类以外定义此操作员是可行的方法,可能需要朋友声明或实用程序功能。为什么它不起作用?我不知道,你一定犯了一个错误,但是不看代码就说不出来(当然这只是一个简单的例子)。 – 2014-10-19 18:14:52

+0

您似乎已经发布了几天的相同代码,但仍未解决将“Word”和“Sentence”的类定义放在哪里的基本问题。首先解决这个问题,然后所有其他问题都会消失。 – 2014-10-19 21:36:23

回答

0

你得到这个错误的原因是,当你转发声明Sentence你不提供编译器的信息,它需要产生的代码调用方法的前向声明的类或按值返回。你可以用一个前向声明的类来做一个指针。对于其他一切,必须提供完整的定义。

Word类的实现文件中包含具有Sentence类的定义的头文件。这将解决这个编译问题。

至于实施得好,这条线看上去效率低:

Sentence *s = new Sentence(sentence.getCopy()); 

你被它传递给拷贝构造函数使得已经是副本句子的另一个副本。这两个方案应该工作以及避免不必要的复制:

Sentence *s = &sentence.getCopy(); 

Sentence *s = new Sentence(sentence); 

当然,这不会消除返回一个动态分配的对象的副本,而无需调用delete导致内存泄漏。

这将避免内存泄漏问题:

Sentence s(sentence); 
+0

'句子(句子);'看起来比所有这些选项好得多,并且避免了内存泄漏。 – 2014-10-19 21:33:49

+0

@MattMcNabb谢谢:) – dasblinkenlight 2014-10-19 21:40:57

相关问题