-3

タイプ(たとえばdegrees)を作成し、その特定の演算子を定義することは可能ですか?例:=, +, *, -, /, +=, *=, -=, /=

プログラムの1つに度を使用する必要があり、単純なものよりも使用が冗長である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)に等しくする必要があります。したがって、これらの演算子をオーバーロードして、値を0から360の間に保ちます。a = 6150a = 30

出来ますか?そして、もしそうなら、どのように?

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 に答える