1

我似乎有一个可以按情况工作的赋值运算符。我有一个 Vector2 类,它包含两个浮点数,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 分配之前或之后,都没有效果。

4

2 回答 2

14

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

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

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

它起作用的原因

Vector2 newPosition = ...;

是因为这不是默认构造+赋值,而是复制构造调用。

于 2012-06-22T14:28:13.790 回答
1

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

你需要类似的东西:

Vector2& Vector2::operator=(const Vector2 &right)
{
    x = right.x;
    y = right.y;
    return *this;
}
于 2012-06-22T14:30:31.227 回答