2015-02-18 3 views
1

У меня есть простая функция присваивания следующим образом:Правильно используя конструкторы в C++

LinkedList& LinkedList::operator=(const LinkedList &l) { 
    // handle self assignment 
    if (this == &l) { 
     return *this; 
    } 

    // free old elements of the list before the new elements from l are assigned 
    ~*this(); 

    // build the list as a deep copy of l (copy constructor handles empty case) 
    this(l); 

    return *this; 
} 

и всякий раз, когда я запускаю свою программу, я получаю error: ‘this’ cannot be used as a function ответ. Как я должен использовать конструкторы в их реальном контексте? Любая помощь очень ценится!

+0

Вы можете просто использовать 'std :: list'. Это связанный список. –

+5

Сама идея плохая. Смотрите это: http://www.gotw.ca/gotw/023.htm –

+2

Просто скопируйте и поменяйте. Легче и не сломано –

ответ

3

Правильный синтаксис для того, что вы пытаетесь это:

this->~LinkedList(); 
new(this) LinkedList(l); 

Вы ясно поняли, что это хорошо, чтобы избежать дублирования кода, однако предпочтительный способ пойти об этом, чтобы использовать copy and swap idiom писать оператор присваивания.

+1

Я думаю, что деструктор/новая версия - это действительный код, однако если «новый» бросает, то вы попадаете в ужасный беспорядок, поэтому есть все основания, чтобы его избежать. –

+0

Так что все, что мне нужно, это 'swap (* this, &l); return * this;'? – T145

+0

@ T145 да, но без '&'. И функция оператора присваивания должна принимать значение 'l' по значению (не по ссылке). –

3

Конструкторы или деструкторы ручного вызова - почти всегда очень плохая идея. Они не предназначены для этого.

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

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