<分区>
我们的 vector 类中有一些奇怪的错误行为。它给我们上了宝贵的一课。
class Vector3D
{
float x, y, z, w;
public:
Vector3D( float ax, float ay, float az, float aw )
: x(ax), y(ay), z(az), w(aw)
{}
Vector3D( float ax, float ay, float az ) // for when you don't care about w
: x(ax), y(ay), z(az)
{}
void Assign( const Vector3D& rhs )
{
x = rhs.x;
y = rhs.y;
z = rhs.z;
w = rhs.w;
}
bool operator==( const Vector3D& o )
{
return (x==o.x && y==o.y && z==o.z && w==o.w);
}
// lots more stuff
}
int main()
{
Vector3D a(1.0f,2.0f,3.0f);
Vector3D b(4.0f,5.0f,6.0f);
a.Assign(b);
bool result=(a==b); // Expected: true. Actual: false, sometimes
}
一段时间以来,Assign
函数似乎存在错误。我们会用它来将一个 vector 的值复制到另一个 vector ,但稍后代码将无法匹配我们知道应该相同的点。设置了数据断点,但未能命中。头都被抓破了。最终,我们将代码添加到 Assign
的末尾,它会立即调用 operator==
来检查两个 vector 是否相同……但事实并非如此。
出了什么问题?