BerthaDusStuf Ответов: 2

Является ли этот код оператора присваивания C++ неверным?


Я читаю книгу, и она включает в себя код для оператора присваивания, и я почти уверен, что это неверно, но я также думаю, что, возможно, я просто ошибаюсь, потому что маловероятно, что книга сделает ошибку. Вот этот код:
LinkedList& LinkedList::operator= (const LinkedList& other)
{
// make sure we aren't assigning to ourself--we can just ignore
// that if it happens. Notice that we're using 'this' here to ensure
// that the other value isn't the same address our as object
if ( this == & other )
{
// return this object to keep the chain of assignments alive
return *this;
}
// before copying over the new values, we need to free the old memory
// since it's no longer used
delete _p_head;
_p_head = NULL;
LinkedListNode *p_itr = other._p_head;
while ( p_itr != NULL )
{
insert( p_itr->val );
}
}

Проблема в том, что он никогда не увеличивает p_itr, поэтому p_itr просто всегда указывает на начало списка. Является ли код неверным?

Кроме того, у меня есть отдельный вопрос: поскольку этот оператор присваивания работает со ссылками на переменные, почему он должен что-то возвращать и куда идут возвращаемые значения?

И последний вопрос, не связанный с этим, заключается в том, что вот какой-то код, который определяет оператор=, но перед функцией не задан тип:

operator= (const Player& other);


это код внутри частной части структуры. Почему у него нет типа?

Что я уже пробовал:

Ничего............................................................

0x01AA

Это не конструктор копирования, это оператор присваивания. Конструктор копирования имеет подпись class_name ( const class_name & )

BerthaDusStuf

О, хорошо, извините, я не понял, я имею в виду определение оператора присваивания

2 Ответов

Рейтинг:
20

«_Superman_»

Это не конструктор копирования.
Это оператор присваивания.

Подпись конструктора копирования будет выглядеть примерно так LinkedList(const LinkedList& rhs);
Помните, что конструкторы ничего не возвращают.

Цитата:
работает ли он со ссылками на переменные, зачем ему нужно что-то возвращать и куда идут возвращаемые значения?

Чтобы вы могли сделать что-то вроде list1 = list2 = list3 = list4 = ...

Цитата:
он никогда не увеличивает p_itr

Вам, вероятно, нужно заглянуть внутрь insert метод, чтобы выяснить, если там что - нибудь случится.

Цитата:
оператор= (const Player& other);

Не правильный. На самом деле это подпись для конструктора копирования типа Player(const Player& other);


BerthaDusStuf

- Чтобы вы могли сделать что-то вроде list1 = list2 = list3 = list4 = ..."

Это потому что это как писать:
list1.operator=(list2.operator=(list3.operator=(list4)))


"Вам, вероятно, нужно заглянуть внутрь метода вставки, чтобы выяснить, если там что-то произойдет"

Но метод insert не принимает p_itr в качестве параметра, поэтому он не может его изменить, он принимает значение, на которое указывает p_itr. Это могло быть просто ошибкой в книге, но я просто не хотел предполагать это, прежде чем проверить людей, которые знают лучше.

"Не правильный. На самом деле это подпись для конструктора копирования, такого как Player(const Player& other);"

Извините, что я имел в виду оператор присваивания, а не конструктор копирования. Является ли operator=(const Player& other); допустимым определением для конструктора копирования, поскольку тип не задан.

«_Superman_»

&ГТ;&ГТ; это потому, что это похоже на написание:
>> list1.operator=(list2.operator=(list3.operator=(list4)))
Это верно.

но метод insert не принимает p_itr в качестве параметра, поэтому он не может его изменить, он принимает значение, на которое указывает p_itr.
Я имел в виду то, что можно было бы сделать с макросами препроцессора, как в этой ссылке - Макрос OFFSETOF () - GeeksforGeeks[^]
Но это, вероятно, не применимо здесь. Вы можете попробовать отладить код, чтобы проверить, что происходит на самом деле.

&ГТ;&ГТ;оператор=(константный-плеер и усилитель; другие); правильное определение
В C++ это не так. В языке C в качестве возвращаемого типа предполагается int, если ничего не указано.
Однако это противоречит цели, так как вы пытаетесь сделать копию объекта, если у вас нет конструктора преобразования одного целочисленного аргумента.

BerthaDusStuf

Хорошо, спасибо, очень простой для понимания и хорошо структурированный ответ

Рейтинг:
0

KarstenK

В конструкторе копирования вы должны создать ПОЛНАЯ КОПИЯ для нового объекта. Таким образом, вы должны скопировать все элементы-члены в уникальном материале для построенного объекта.

При копировании связанного списка необходимо создать копию каждый элемент и внесите в него новый список.

тебе нужно:

Player& operator= (const Player& other);


Видеть это руководство по эксплуатации.


BerthaDusStuf

Хорошо спасибо