1

非常に単純な質問に思われるかもしれませんが、私は次の使用例を念頭に置いています。

struct fraction {
    fraction( size_t num, size_t denom ) : 
        numerator( num ), denominator( denom )
    {};
    size_t numerator;
    size_t denominator;
};

私がやりたいのは、次のようなステートメントを使用することです。

fraction f(3,5);
...
double v = f; 

v私の分数で表される値を保持するようになりました。C ++でこれを行うにはどうすればよいですか?

4

5 に答える 5

7

これを行う 1 つの方法は、変換演算子を定義することです。

struct fraction
{
  size_t numerator;
  size_t denominator;

  operator float() const
  {
     return ((float)numerator)/denominator;
  }
};

ほとんどの人は、スタイルの問題として、暗黙的な変換演算子を定義しないことを好みます。これは、変換演算子が「舞台裏」で動作する傾向があり、どの変換が使用されているかを判断するのが難しい場合があるためです。

struct fraction
{
  size_t numerator;
  size_t denominator;

  float as_float() const
  {
     return ((float)numerator)/denominator;
  }
};

このバージョンでは、as_floatメソッドを呼び出して同じ結果を取得します。

于 2009-05-26T04:41:45.870 に答える
3

代入演算子と変換コンストラクターは、他のクラスのオブジェクトから自分のクラスのオブジェクトを初期化するためのものです。代わりに、他のタイプのオブジェクトをクラスのオブジェクトで初期化する方法が必要です。それが変換演算子の目的です。

struct fraction {
     //other members here...
     operator double() const { return (double)numerator / denominator;}
     //other members here...
};
于 2009-05-26T04:45:01.450 に答える
2

演算子 double を使用して変換できます。

struct fraction
{
     operator double() const
      {
         //remember to check for  denominator to 0
          return (double)numerator/denominator;
      }
};
于 2009-05-26T04:43:54.447 に答える
1

operator=それとは何の関係もありません。むしろ、あなたstructのパブリックoperator doubleに次のようなものを追加したいと考えています:

operator double() {
  return ((double) numerator))/denominator;
}
于 2009-05-26T04:40:46.637 に答える
0

コンパイラは構造体の分数を倍精度浮動小数点数に変換する方法を知らないため、これだけ多くのコードを使用すると、コンパイラ エラーが発生します。operator double()変換を提供する場合は、コンパイラがこの変換に使用するを定義する必要があります。

于 2009-05-26T04:42:55.493 に答える