我似乎有一个在情况上有效的赋值运算符。 我有一个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作业。
答案 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;
}