C ++ operator = overload有选择地工作

时间:2012-06-22 14:26:08

标签: c++

我似乎有一个在情况上有效的赋值运算符。 我有一个Vector2类,它包含两个float,x和y。 这是operator =方法:

Vector2 Vector2::operator=(const Vector2 &right)
{
    Vector2 result;
    result.x = right.x;
    result.y = right.y;
    return result;
}

在我的实体的onMove方法中:

Vector2 newPosition = position + (speed * getSpeedFactor());

if (posValid(newPosition))
{
    position.x = newPosition.x;
    position.y = newPosition.y;
    //position = newPosition;
}

其中speedFactor取决于帧率,posValid是检查点是否在墙上或其他东西。位置和速度也是Vector2的。 第一项任务:

Vector2 newPosition = position + (speed * getSpeedFactor());

有效,并且代码按原样获得预期/预期的行为,但是

position = newPosition;

无论是自己还是在.x&之前或之后都无效。 .y作业。

2 个答案:

答案 0 :(得分:14)

你的operator=()错了,它应该修改当前对象,而不是你创建的额外对象

Vector2& Vector2::operator=(const Vector2 &right) 
{
  x = right.x; 
  y = right.y; 
  return *this; 
}

注意:返回类型是一个引用,您将返回对当前对象的引用,而不是它的副本(或代码中的新引用)。

它适用于

的原因
Vector2 newPosition = ...;

是因为这不是 default-construct + assignment ,而是 copy-construct 调用。

答案 1 :(得分:1)

您实际上并未分配给position。您正在创建一个临时Vector2对象,分配给它,然后隐式复制它并返回副本。你永远不会修改实际的对象。

您需要以下内容:

Vector2& Vector2::operator=(const Vector2 &right)
{
    x = right.x;
    y = right.y;
    return *this;
}