1

私は自分のプロジェクトで少し合理的なクラスを行っており、すべての算術演算子をオーバーロードしています。さて、operator= をオーバーロードしようとすると、Little があり、自分の問題 (どのように機能するかわかりません) なのか、自分の書いたコードの問題なのか (書き方が悪い) わかりません。コードは次のとおりです。

class rational{

   public:
      double& operator=(double& d){
         d= this->num/this->den;
         return d;
      }
      double& operator=(rational& r){
            double d= r.num/r.den;
            return d;
      }
      double& operator=(){
            double d= this->num/this->den;
            return d;
      }
}

わかりました、何が問題なのですか?何が正しいですか?(私はすべてが間違っていると思います笑)

私の目標はそれをすることです:

int main(){
    rational r(4, 5);
    double d= r;
}

私はそれを行うことができますか?はいの場合、どのように?

4

2 に答える 2

3

この目的のために代入演算子は必要ありません。代わりに、変換演算子をオーバーロードする必要があります。例えば

class rational {
  private: 
    int num;
    int den; 

  public: 
    // ... 
    operator double() { return double(num) / double(den); }
};

これにより、

rational r(4, 5);
double d = double(r); // d = 0.8 

代入演算子は、許可したい場合、既存のオブジェクトの状態を変更するために使用する必要があります。おそらく、double を有理数に代入することを許可したくないでしょう。そのような操作には明確な意味はありません。ただし、別の有理数を割り当てるための通常のヘルパーに加えて、たとえば、int を割り当てるためのヘルパーを提供したい場合があります。

rational &operator=(const rational &rhs)
{
    num = rhs.num;
    den = rhs.den;
    return *this;
}

rational &operator=(int rhs)
{
    num = rhs;
    den = 1;
    return *this;
}
于 2013-08-16T04:33:39.833 に答える