让赋值运算符作用于声明
make assignment operator work on declaration
我试图制作一个不可变的角度 class(如下所示)。 Angle z = 42;
不起作用。我如何让它发挥作用?示例:
Angle a(1); // works
Angle b; b = 2; // works
Angle c {25}; // works
Angle d {26.0}; // works
Angle e = 27.0; // doesn't compile -- why not?
auto f = Angle(28.0); // works
来源:
class Angle {
double _angle;
public:
explicit Angle(double value) noexcept : _angle(wrap0To2Pi(value)) {}
Angle() = default;
Angle(const Angle& angle) noexcept : _angle(angle._angle) {}
Angle(const Angle&& angle) noexcept : _angle(angle._angle) {}
operator double() const { return _angle; }
Angle& operator=(const Angle& f) noexcept { _angle = f._angle; return *this; }
Angle& operator=(double t) { _angle = wrap0To2Pi(t); return *this; }
Angle operator+(Angle value) const { return Angle(_angle + value._angle); }
Angle operator-(Angle value) const { return Angle(_angle - value._angle); }
Angle operator*(Angle value) const { return Angle(_angle * value._angle); }
constexpr static double DEFAULT_ANGLE_TOLERANCE = 0.0001;
bool equals(Angle value, double tolerance = DEFAULT_ANGLE_TOLERANCE) const; // needs to wrap
bool operator==(Angle value) const { return equals(value); }
bool operator!=(Angle value) const { return !equals(value); }
...
我还应该在这里更改什么吗?谢谢你的时间。
在表格的定义中
Angle e = 27.0;
只有初始化,没有赋值。这将尝试调用 Angle
的构造函数,该构造函数将接受 double
参数。但是,由于您已将 Angle(double)
构造函数标记为 explicit
,因此无法使用此语法执行此转换。
如果您希望它起作用,请删除 explicit
关键字。
我试图制作一个不可变的角度 class(如下所示)。 Angle z = 42;
不起作用。我如何让它发挥作用?示例:
Angle a(1); // works
Angle b; b = 2; // works
Angle c {25}; // works
Angle d {26.0}; // works
Angle e = 27.0; // doesn't compile -- why not?
auto f = Angle(28.0); // works
来源:
class Angle {
double _angle;
public:
explicit Angle(double value) noexcept : _angle(wrap0To2Pi(value)) {}
Angle() = default;
Angle(const Angle& angle) noexcept : _angle(angle._angle) {}
Angle(const Angle&& angle) noexcept : _angle(angle._angle) {}
operator double() const { return _angle; }
Angle& operator=(const Angle& f) noexcept { _angle = f._angle; return *this; }
Angle& operator=(double t) { _angle = wrap0To2Pi(t); return *this; }
Angle operator+(Angle value) const { return Angle(_angle + value._angle); }
Angle operator-(Angle value) const { return Angle(_angle - value._angle); }
Angle operator*(Angle value) const { return Angle(_angle * value._angle); }
constexpr static double DEFAULT_ANGLE_TOLERANCE = 0.0001;
bool equals(Angle value, double tolerance = DEFAULT_ANGLE_TOLERANCE) const; // needs to wrap
bool operator==(Angle value) const { return equals(value); }
bool operator!=(Angle value) const { return !equals(value); }
...
我还应该在这里更改什么吗?谢谢你的时间。
在表格的定义中
Angle e = 27.0;
只有初始化,没有赋值。这将尝试调用 Angle
的构造函数,该构造函数将接受 double
参数。但是,由于您已将 Angle(double)
构造函数标记为 explicit
,因此无法使用此语法执行此转换。
如果您希望它起作用,请删除 explicit
关键字。