Измените свою функцию на:
Velocity& Velocity::operator=(const Velocity& rhs) {
dx_ = rhs.getDx();
dy_ = rhs.getDy();
x_ = rhs.getX();
y_ = rhs.getY();
return *this;
}
... предполагая, что "dx_", "dy_" и т. д. - это имена реальных переменных. Левая часть присваивания должна быть "lvalue" (чтобы определить ее просто - именованная переменная с адресом), тогда как до того, как вы использовали "rvalue" (временная переменная, которая была возвращена в результате соответствующие функции «получить»). Чтобы разобраться в этом немного подробнее, скорее всего, ваши различные функции «получить» возвращают объект типа значения (например, «int») или константную ссылку (например, «const int&»), но чтобы присвоить что-то, вы действительно нужна изменяемая ссылка (например, "int&"). Присвоение выходных данных функции "get", которая возвращает простой тип значения, бессмысленно, потому что функция get создает копию базовых данных перед ее возвратом. Хотя эта копия может иметь связанный с ней адрес памяти (например, если она была сохранена в стеке, например), присвоение ей не дало бы наблюдаемого эффекта, потому что эта копия ничего не делает и нигде не видна, если она не назначена к некоторой переменной. Однако когда вы используете имя переменной-члена в левой части, назначение на самом деле имеет смысл, поскольку на переменную, получающую присвоение, все еще можно ссылаться в другом месте.
Я также должен отметить, что в своем изменении я удалил кучу лишних this->
es. Есть только два случая, когда this->
строго необходим:
Существует символ с тем же именем, который «закрывает» элемент this
(например, параметр или другая локальная переменная с более узкой областью действия, чем область действия класса), и в этом случае необходимо использовать this->
для выбора члена вместо местный.
Очень неточно: используется template
, так что необходимо явно использовать this->
, чтобы заставить C++ искать в этом классе, а не в области пространства имен (см. поиск зависимого имени для более точного объяснения).
В отсутствие этих двух случаев поиск символов правильно найдет переменные-члены без this->
и, следовательно, он избыточен и, следовательно, его следует избегать (на мой взгляд).
Кроме того, я изменил возвращаемый тип присваивания с "const Velocity&" на "Velocity&", поскольку операторы присваивания обычно возвращают изменяемый экземпляр присваиваемого объекта, и поступать иначе было бы неожиданно; например, заставить функцию возвращать константу breaks:
Velocity velocity = // ...
Velocity default_vaue = // ...
// ... many lines later ...
if (/* some condition /*) {
ReassignIfInvalid(velocity = ComputeSomething(), default_value);
}
... где функция «ReassignIfInvalid» требует, чтобы параметр был изменяемым, чтобы он мог условно перезаписывать значение. Хотя приведенный выше код может быть не лучшим кодом для подражания, тем не менее, он удивит, если результат присваивания неизменен.
person
Michael Aaron Safyan
schedule
19.02.2015
(x=y)=z
? Кажется ненужным. - person Ed S.   schedule 19.02.2015