2011-01-30 4 views
2

私は私のクラス内の過負荷「演算子*」を実装したいので、私は次の操作を行うことができるだろう:bが右側にあることをオブジェクトがC++の右側にある場合、*演算子をどのようにオーバーロードしますか?

Rational a(1, 2), b; 
b = 0.5 * a; // b = 1/4 

お知らせ、そんなことをする方法がありますinside "Rational"クラス?

+2

無料の機能ではなく、あなたのクラスの中にあるのはなぜそれほど重要なのですか?あなたのクラスを使用する人の観点からは、違いはありません。 –

+0

実際、自由な関数を愛することを学ぶことが大好きです...オペレータを自由な関数として実装するのは、一連の理由から演算子を実装する方が良いでしょう。たとえば、演算子の左側に暗黙の変換が許可されません。オペレータがメンバ関数として実装されている場合のオペレーション –

答えて

6

いいえ無料機能としてoperator*を定義する必要があります。もちろん、第2引数のメンバー関数の観点から実装することができます。

0

答えはありませんが、浮動小数点値は左側にあるので、 "0.5 * a"からの結果のタイプは2倍になることがあります。その場合は、変換演算子について何かすることを検討することができます。 "pow(a、b)"は、そのアイデアを説明するためだけに追加されています。

1 #include <stdio.h> 
    2 #include <math.h> 
    3 
    4 class Complicated 
    5 { 
    6 public: 
    7  Complicated(int a, int b) : m_a(a), m_b(b) 
    8  { 
    9  } 
10  
11  Complicated(double a) : m_a(a) 
12  { 
13  } 
14  
15  template <typename T> operator T() 
16  { 
17   return (T)(pow(10, m_b) * m_a); 
18  } 
19  
20  void Print() 
21  { 
22   printf("(%f, %f)\n", m_a, m_b); 
23  } 
24  
25 private: 
26  double m_a; 
27  double m_b; 
    28 }; 
29 
30 
31 int main(int argc, char* argv[]) 
32 { 
33  Complicated pr(1, 2); 
34  Complicated c = 5.1 * (double) pr; 
35  c.Print(); 
36 } 
37 
3

はい:

class Rational { 
    // ... 
    friend Rational operator*(float lhs, Rational rhs) { rhs *= lhs; return rhs; } 
}; 

注:これは、もちろんfriendキーワードの乱用です。 でなければなりません。

関連する問題