2014-10-19 3 views
0

У меня есть класс «Предложение», в котором # включает «Слово».Тип возвращаемого значения функции класса не определен

Sentence - это связанный список слов.

Мои государства назначения, которые я должен перегружать «оператор +», так что

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

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

Имейте в виду, что я должен перегружать оператор +. Это то, что я оцениваю на

Однако, поскольку предложение Sentence содержит Word, его еще не определено. Я получаю сообщение об ошибке

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

+1

Определение этого оператора вне класса - это способ пойти в этом случае, возможно, благодаря объявлениям друзей или служебным функциям. Почему это не сработало? Я не знаю, вы, должно быть, допустили ошибку, но нельзя сказать, не глядя на код (конечно, с минимальным примером). –

+0

Вы, кажется, уже несколько дней публиковали этот же код и до сих пор не исправили основную проблему, в которой вы помещаете определения классов для «Word» и «Sentence». Исправьте это сначала, а затем все остальные проблемы исчезнут. –

ответ

0

Причина, по которой вы получаете эту ошибку, заключается в том, что когда вы пересылаете-объявляете Sentence, вы не предоставляете компилятору информацию, необходимую ему для создания кода, который вызывает методы forward-объявил класс или вернуть его по значению. Все, что вы можете сделать с объявленным вперед классом, делает указатель на него. Для всего остального должно быть доступно полное определение.

В файле реализации класса Word содержится заголовочный файл с определением класса Sentence. Это устранит эту проблему компиляции.

Насколько идет реализация, эта линия выглядит неэффективна:

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

вы делаете еще одну копию приговора, который уже копия, передав его в конструктор копирования. Эти две альтернативы должны работать, а без ненужного копирования:

Sentence *s = &sentence.getCopy(); 

или

Sentence *s = new Sentence(sentence); 

Конечно, это не позволит устранить утечку памяти в результате возврата копии динамически выделяемый объект без вызова delete.

Это позволит избежать проблем утечки памяти:

Sentence s(sentence); 
+0

'Предложение s (предложение);' выглядит намного лучше, чем все эти параметры, и позволяет избежать утечки памяти. –

+0

@MattMcNabb Спасибо :) – dasblinkenlight

Смежные вопросы