2014-10-19 67 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

相關問題