2015-02-04 4 views
0

Для моего задания домашней работы мне нужно создать объединенный список. У меня есть конструктор копирования и оператор присваивания перегружен, но может показаться, что оператор + перегружен. У меня есть определенный деструктор, который очищает список.Перегрузка оператора + с помощью односвязного списка

List List::operator+(const List &add) 
{ 
    List result; 
    result += *this; 
    result += add; 
    return result; 
} 

+ = работает. Кроме того, когда я делаю что-то вроде следующего: Список list3 = list1 + list2; Это работает. Кажется, что деструктор вызывается непосредственно перед возвратом, так что я ничего не получаю за List3 если я

List list3;  
list3 = list1 + list2; 

Вот конструктор копирования, перегрузки назначение, и + = перегрузка

List& List::operator=(const List &assign) 
{ 
    Node *traverse = assign.head; 
    int x; 
    int *passX = &x; 
    while (traverse != nullptr) 
    { 
     x = traverse->getItem(); 
     this->Insert(passX); 
     traverse = traverse->getNext(); 
    } 
    return *this; 
} 

List342& List342::operator+=(const List342 &add) 
{ 
    Node *traverse = add.head; 
    int x; 
    int *passX = &x; 
    while (traverse != nullptr) 
    { 
     x = traverse->getItem(); 
     this->Insert(passX); 
     traverse = traverse->getNext(); 
    } 
    return *this; 
} 

List342::List342(const List342 &copy) 
{ 
    *this = copy; 
} 

struct Node 
    { 
     int item; 
     Node *next = nullptr; 
     int getItem() const; 
     Node* getNext() const; 
     void setItem(const int &val); 
     void setNext(Node* nodePtr); 
    }; 
    Node *head; 
    int itemCount; 

Последние part - это структура для узла, а две переменные - любой объект этого класса.

Благодаря

+0

Вы подчиняетесь [правилу из трех] (http://en.cppreference.com/w/cpp/language/rule_of_three)? Фактически скопируйте * список * или только указатель (и)? –

+5

почтовый код, который воспроизводит проблему ... –

+2

«+» отлично выглядит. Если копирование выполняется, проблема заключается в операторе присваивания. – molbdnilo

ответ

-1

Хорошая работа реализации оператора + в зависимости от оператора + =. Тем не менее, вы должны объявить как LHS, так и RHS const при перегрузке оператора +.

const List List::operator+(const List &add) const 
{ 
    List result; 
    result += *this; 
    result += add; 
    return result; 
} 

Первая сопзЬ означает, что функция возвращает константный список, так что вы не можете:

List A, B, C; 
A + B = C; 

Второе означает, что функция не изменяет свои переменные-члены, так что вы может доверять, что A + B не изменяет A.

Предполагая, что конструктор по умолчанию является пустым списком, а ваш класс не использует указатели, попробуйте объявить const правильно. Константы переменных переменных различны, чем неконстантные. Если ваш класс использует указатели, убедитесь, что вы на самом деле копируете соответствующую память, а не только адреса памяти.

+0

Не уверен, что я следую за тем, почему результат должен быть const. Например, 'l3.Splice (l1 + l2)' – sp2danny

+3

Возвращение const - плохая идея; он предотвращает ходы, между прочим. Если вы хотите предотвратить «A + B = C;», правильным решением является применение * ref-qualifier * к 'operator ='. –

+0

результат должен быть const, потому что 'A + B' никогда не должен быть значением lhs. является 'l3.Splice (l1 + l2) l3.Splice (l1 + l2)' предполагается модифицировать 'l1' или' l2'? это неоднозначный код и вообще ужасный стиль. если вы хотите использовать значения rhs в вызове функции, объявите их const ... –

0

Так мне удалось понять это

List& List::operator+(const List &add) 
{ 
    List *result = new List; 
    *result = *this; 
    *result += add; 
    return result; 
} 

Моего деструктор убирал список до его возвращения ... Выделяя пространство в куче препятствует деструктору делать это.

Спасибо за помощь всем!

+0

это ошибка скрывается, а не проблема. Я подозреваю, что это одна из тех функций, которые вы не показывали, может быть List :: List() или List :: Insert() – sp2danny

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