我试图覆盖=运算符,以便我可以将我的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);
}
再次感谢所有帮助:)
答案 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;
}
答案 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 =
并按引用返回!完成!
我建议改为实现转换构造函数。