在C ++中覆盖=运算符

时间:2010-10-19 21:46:09

标签: c++ override

我试图覆盖=运算符,以便我可以将我的Point类更改为Vector3类。

Point tp = p2 - p1;
Vec3 v;
v = tp;

我面临的问题是,“v”的x,y,z成员总是等于零。

Vec3.h:

Vec3 operator =(Point a) const;

Vec3.cpp:

Vec3 Vec3::operator =(Point a) const
    {
        return Vec3(a.x,a.y,a.z);
    }

再次感谢所有帮助:)

8 个答案:

答案 0 :(得分:7)

已经有一段时间了,但我认为你想要

Vec3& Vec3::operator=(const Point &a) 
{
    x = a.x; y = a.y; z = a.z;

    return *this;  // Return a reference to myself.
}

分配修改'this',因此它不能是const。它不会返回新的Vec3,它会修改现有的Vec3。你可能也想要一个Point的拷贝构造函数,它也是如此。

答案 1 :(得分:1)

作业操作员就像这样工作。

Vec3.h:

Vec3& operator = (const Point &a);

Vec3.cpp:

Vec3& Vec3::operator = (const Point &a)
{
    x = a.x;
    y = a.y;
    z = a.z;
    return *this;
}

请注意,您正在修改this对象并返回一个非const引用。

答案 2 :(得分:1)

你想要这个:

Vec3 & Vec3::operator =(const Point &a) 
{
x = a.x;
y = a.y;
z = a.z;
return *this;
}
  1. 作业应修改此对象,而不是返回
  2. 返回对刚修改的对象的引用

答案 3 :(得分:1)

我同意 sheepsimulator ,因为复制赋值运算符应该具有与复制构造函数相同的行为。根据HIGH·INTEGRITY C ++ CODING STANDARD MANUAL,您应该实现一个显式转换运算符:

class Point { explicit operator Vec3() { return Vec3(this->x,this->y,this->z);  } };

答案 4 :(得分:1)

使用转换构造函数执行此操作更为常见:

Vec3(const Point& p) : x(p.x), y(p.y), z(p.z) {}

这也将允许您想要的分配。

答案 5 :(得分:0)

为什么不这样做:

void Vec3::SetCoord(const Point& pnt)
{
    x = pnt.x;
    y = pnt.y;
    z = pnt.z;
}

... OR

创建一个新的重载构造函数:

Vec3::Vec3(const Point& pnt)
{
    x = pnt.x;
    y = pnt.y;
    z = pnt.z;
}

没有疯狂的施法或等于操作员参与。我建议做其中一种方式,它可能是最容易维护的。


要获得上面的equals语法,应该真正添加一个类型转换运算符,但要添加到Point:

class Point
{
     // ....

     operator Vec3()
     {
        return Vec3(this->x,this->y,this->z);
     }
};

在不假设类型转换的情况下,在这样的两个对象之间进行分配是有趣的。大多数类的语法行为都不那样。

但请注意,这可能会导致一些歧义,本网站上许多回答C ++问题的备受尊敬的人会说类型转换答案会导致各种令人讨厌的问题。所以我会避免它。

答案 6 :(得分:0)

有一些答案解释了如何做你想做的事情,但我会解释你的原始代码发生了什么:

在C ++中(如在C中),您的赋值v = tp是表达式,而不是语句。如果您编写x = 1,那么您可以编写y = (x = 1),因为赋值(x = 1)是一个值为1的表达式。当您在C ++中覆盖赋值运算符时,您负责这两个部分:必须修改this,并且必须返回赋值表达式的值。您的原始版本只负责返回表达式的值。如果你写了Vec3 w = (v = tp),那么w就会有预期的值,而v仍然是0。

在C ++中表达相同内容的另一种方法是在Point类中添加operator Vec3,这样就可以在任何可以使用Vec3的地方使用Point。更好的是可能有一个类Vec3和typedef Vec3 Point,因为它们大致相同。

答案 7 :(得分:0)

嗯,这里已经有6个回答了,你已经选择了一个,但最简单,最明显的恕我直言。但

Vec3 &Vec3::operator =(Point a) // not const, return by reference
    {
        return *this = Vec3(a.x,a.y,a.z);
    }

这就是全部!只需插入*this =并按引用返回!完成!

我建议改为实现转换构造函数。