作为运算符重载的赋值的左操作数,需要左值

时间:2015-02-19 05:36:04

标签: c++ operator-overloading member-functions

我正在尝试执行运算符重载但是当我从.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;

我收到错误 - &gt;行

lvalue required as left operand of assignment

请帮忙!

2 个答案:

答案 0 :(得分:1)

将您的功能更改为:

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

...假设“dx_”,“dy_”等是实际变量的名称。赋值的左侧必须是“左值”(简单地定义它 - 带有地址的命名变量),而在使用“rvalue”之前(由于rvalue而返回的临时变量)相应的“获取”功能)。为了更详细地讨论这个,很可能你的各种“get”函数返回一个值类型的对象(例如“int”)或一个const引用(比如“const int&amp;”),但要分配给某个东西,你真的需要一个可变引用(例如“int&amp;”)。分配给返回简单值类型的“get”函数的输出是没有意义的,因为get函数正在做的是在返回之前创建基础数据的 copy 。虽然这个副本可能有一个与之关联的内存地址(例如,如果它存储在堆栈中),分配给它将不会产生任何可观察到的效果,因为除非分配了副本,否则此副本不会执行任何操作或在任何地方看到一些变量。但是,当您在左侧使用成员变量的名称时,分配实际上是有意义的,因为接收赋值的变量仍然可以在其他地方引用。

我还应该注意到,在我的更改中,我删除了一堆多余的this-> es。只有两种情况需要this->

  1. 有一个同名的符号“遮盖”this的成员(例如,一个参数或其他局部变量,其范围比类范围更窄),在这种情况下它是必须使用this->来选择本地成员。

  2. 非常不精确:涉及template,因此必须明确使用this->使C ++在此类而不是命名空间范围内查看(请参阅dependent name lookup为了更精确的解释)。

  3. 如果没有这两种情况,符号查找将正确地找到没有this->的成员变量,因此它是多余的,因此要避免(在我看来)。

    另外,我从“const Velocity&amp;”改变了赋值的返回类型。到“Velocity&amp;”,因为赋值运算符通常返回指定对象的可变实例,否则可能会令人惊讶;例如,使函数返回一个const break:

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

    ...其中函数“ReassignIfInvalid”要求参数是可变的,以便它可以有条件地覆盖该值。虽然上面的代码可能不是最好的模拟代码,但如果赋值的输出是不可变的,那么它将会令人惊讶。

答案 1 :(得分:0)

在.cpp函数中,你告诉getter函数应该从另一个函数获取一个值,所以你没有真正做某事。如果有,请使用setter函数。通过你可以更好地公开你的价值而不是使用getter和setter。