是否可以创建一个类型(比方说degrees
)并为其定义特定的运算符?例如:=, +, *, -, /, +=, *=, -=, /=
。
我想知道这是因为我需要为我的某个程序使用度数而我不想使用float
对象,因为使用degrees a; a.value = 120; a.value = b.value + a.value;
对于简单degrees a = 120; a = b+a;
来说是多余的}。
现在我为什么不使用:
typedef float degrees;
?好吧,因为我还需要一件事。我写的时候
degrees a;
a = 120;
a += 300;
a
应该等于60
(420-360),因为当a = 6150
具有相同的效果时,我真的不需要a = 30
。所以我会重载这些运算符以保持0到360之间的值。
有可能吗?如果是这样,怎么样?
答案 0 :(得分:6)
您的问题的解决方案不需要Boost或任何其他库。你可以通过使用C ++类来实现你想要的,并重载你想要的数学运算符(+, - ,*,/等)和你想要的赋值运算符(=,+ =, - =等)和比较您想要的运营商(<,>,< =,> =等)......或者您想要的任何运营商!
例如:
#include <cmath>
class Degrees {
public:
// *** constructor/other methods here ***
Degrees& operator=(float rhs) {
value = rhs;
normalize();
return *this;
}
Degrees& operator+=(const Degrees &rhs) {
value += rhs.value;
normalize();
return *this;
}
Degrees operator+(const Degrees &rhs) {
return Degrees(value + rhs.value);
}
private:
float value;
void normalize() {
value = std::fmod(value, 360);
}
};
然后你可以这样做:
Degrees a, b; // suppose constructor initializes value = 0 in all of them
a = 10;
b = 20;
a += b; // now, a = 30.
Degrees c = a + b; // now, c = 50.
我已经给你一个重载赋值和加号运算符的例子,但是你可以尝试使用任何其他类型的东西,它应该可以工作。
答案 1 :(得分:5)
这是一个起点:
class Degrees {
public:
explicit Degrees(float value) : value(normalized(value)) { }
Degrees &operator+=(Degrees that)
{
value += that.value;
return *this;
}
private:
float value;
};
inline Degrees operator+(Degrees a,Degrees b)
{
a += b;
return a;
}
使用示例:
{
Degrees a(120);
Degrees b(300);
Degrees c = a+b;
}