-3

是否可以创建一个类型(比如说degrees)并为其定义特定的运算符?如:=, +, *, -, /, +=, *=, -=, /=

我想知道这是因为我需要为我的一个程序使用度数,而我不想使用float对象,因为 usingdegrees 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 之间。

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

4

2 回答 2

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.

我给了你一个重载赋值和加号运算符的例子,但你可以用任何其他类型尝试同样的事情,它应该可以工作。

于 2012-12-05T03:23:01.247 回答
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;
}
于 2012-12-05T03:12:39.277 回答