定义新类型并重载其运算符

时间:2012-12-05 03:03:54

标签: c++ operator-overloading

是否可以创建一个类型(比方说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之间的值。

有可能吗?如果是这样,怎么样?

2 个答案:

答案 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;
}