gpt4 book ai didi

c++ - 左值需要作为运算符重载赋值的左操作数

转载 作者:行者123 更新时间:2023-11-28 06:25:33 24 4
gpt4 key购买 nike

我正在尝试进行运算符重载,但是当我从 .cpp 运行这段代码时,一直出现错误

头文件原型(prototype)是这样的,

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;
}

在 main 中使用运算符的地方看起来像。

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

请帮忙!

最佳答案

将您的功能更改为:

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

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

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

  1. 有一个同名符号“遮盖”了this 的成员(例如,一个参数或其他比类范围更窄范围的局部变量),其中如果需要使用 this-> 来选择本地成员。

  2. 非常不精确:涉及到一个模板,因此有必要显式地使用this-> 来让C++ 在这个类中而不是在命名空间中查找范围(请参阅 dependent name lookup 以获得更精确的解释)。

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

此外,我将赋值的返回类型从“const Velocity&”更改为“Velocity&”,因为赋值运算符通常返回赋值对象的可变实例,否则可能会令人惊讶;例如,让函数返回一个 const 中断:

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

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

关于c++ - 左值需要作为运算符重载赋值的左操作数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28599294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com