私は私のクラス内の過負荷「演算子*」を実装したいので、私は次の操作を行うことができるだろう:bが右側にあることをオブジェクトがC++の右側にある場合、*演算子をどのようにオーバーロードしますか?
Rational a(1, 2), b;
b = 0.5 * a; // b = 1/4
お知らせ、そんなことをする方法がありますinside "Rational"クラス?
私は私のクラス内の過負荷「演算子*」を実装したいので、私は次の操作を行うことができるだろう:bが右側にあることをオブジェクトがC++の右側にある場合、*演算子をどのようにオーバーロードしますか?
Rational a(1, 2), b;
b = 0.5 * a; // b = 1/4
お知らせ、そんなことをする方法がありますinside "Rational"クラス?
いいえ無料機能としてoperator*
を定義する必要があります。もちろん、第2引数のメンバー関数の観点から実装することができます。
答えはありませんが、浮動小数点値は左側にあるので、 "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
はい:
class Rational {
// ...
friend Rational operator*(float lhs, Rational rhs) { rhs *= lhs; return rhs; }
};
注:これは、もちろんfriend
キーワードの乱用です。 はでなければなりません。
無料の機能ではなく、あなたのクラスの中にあるのはなぜそれほど重要なのですか?あなたのクラスを使用する人の観点からは、違いはありません。 –
実際、自由な関数を愛することを学ぶことが大好きです...オペレータを自由な関数として実装するのは、一連の理由から演算子を実装する方が良いでしょう。たとえば、演算子の左側に暗黙の変換が許可されません。オペレータがメンバ関数として実装されている場合のオペレーション –