Значение l требуется в качестве левого операнда присваивания для перегрузки оператора.

Я пытаюсь перегрузить оператор, но получаю сообщение об ошибке при запуске этого кода из.cpp

Прототип файла заголовка выглядит так,

const Velocity & operator = (const Velocity & rhs);

И функция-член.cpp выглядит следующим образом.

const Velocity & Velocity :: operator = (const Velocity & rhs)
{
   this->getDx() = rhs.getDx();
   this->getDy() = rhs.getDy();
   this->getX() = rhs.getX();
   this->getX() = rhs.getY();
   return *this;
}

где в основном использовании оператор выглядит так.

Velocity v1;
Velocity v2;
Velocity v3;

promptVelocity("Enter values for Velocity 1", v1);
promptVelocity("Enter values for Velocity 2", v2);

// Test operator =
v3 = v1;
cout << "Test operator = : " << v3 << endl;

Я получаю сообщение об ошибке -> строки

lvalue required as left operand of assignment

Пожалуйста помоги!

2 ответа

Измените свою функцию на:

Velocity& Velocity::operator=(const Velocity& rhs) {
  dx_ = rhs.getDx();
  dy_  = rhs.getDy();
  x_ = rhs.getX();
  y_ = rhs.getY();
  return *this;
}

... предполагая, что "dx_", "dy_" и т. д. являются именами фактических переменных. Левая часть присваивания должна быть "lvalue" (чтобы определить его просто - именованная переменная с адресом), тогда как до того, как вы использовали "rvalue" (временная переменная, которая была возвращена в результате соответствующие функции "get"). Если вдаваться в подробности, скорее всего, ваши различные функции "get" возвращают объект типа значения (например, "int") или ссылку на const (например, "const int&"), но чтобы назначить что-либо, вы действительно нужна изменяемая ссылка (например, "int &"). Присвоение выходных данных функции "get", которая возвращает простой тип значения, не имеет смысла, потому что функция get создает копию лежащих в ее основе данных перед ее возвратом. Хотя с этой копией может быть связан адрес памяти (например, если он был сохранен в стеке, например), присвоение ей не даст видимого эффекта, потому что эта копия ничего не делает или нигде не просматривается, если не назначена к некоторой переменной. Однако, когда вы используете имя переменной-члена в левой части, присваивание действительно имеет смысл, поскольку переменная, получающая присваивание, все еще может быть использована в другом месте.

Следует также отметить, что в моем изменении я удалил кучу лишнего this->эс. Есть только два случая, когда this-> строго необходимо:

  1. Существует символ с тем же именем, который "затмевает" член this (например, параметр или другая локальная переменная, которая имеет более узкую область действия, чем область видимости класса), и в этом случае необходимо использовать this-> выбрать члена над местным.

  2. Очень неточно: template участвует так, что необходимо использовать this-> явно для того, чтобы C++ смотрел в этом классе, а не в области имен (см. поиск зависимых имен для более точного объяснения).

В отсутствие этих двух случаев поиск символа будет правильно находить переменные-члены без this-> и, таким образом, это избыточно и, следовательно, его следует избегать (по моему мнению).

Кроме того, я изменил тип возвращаемого значения присваивания с "const Velocity &" на "Velocity &", потому что операторы присваивания обычно возвращают изменяемый экземпляр назначенного объекта, и в противном случае это может удивить; например, заставить функцию возвращать const breaks:

Velocity velocity = // ...
Velocity default_vaue = // ...
// ... many lines later ...
if (/* some condition /*) {
  ReassignIfInvalid(velocity = ComputeSomething(), default_value);
}

... где функция "ReassignIfInvalid" требует, чтобы параметр был изменяемым, чтобы он мог условно перезаписать значение. Хотя приведенный выше код может быть не лучшим кодом для эмуляции, тем не менее, будет удивительно, если выходные данные назначения будут неизменными.

В функции.cpp вы говорите, что функция-получатель должна получить значение от другой функции, так что вы на самом деле ничего не делаете. Если у вас есть, используйте функцию установки. В целом, вы могли бы лучше сделать ваши значения общедоступными, а не использовать методы получения и установки.

Другие вопросы по тегам