2016-11-04 16 views
0

オーバーロードされた状態で(ac + bd)+(ad + bc)と同じ関数(a + bi)*(c + di)演算子(* =) これまでの私は、私のオーバーロードされた関数のためにこれを持っています。オーバーロードされた*への私の定義のために、(ac-bd)の-bd部分を含めるために何を書くべきか分からない。オーバーロード* =複素数の場合

#include <iostream> 

using std::cout; 
using std::cin; 
using std::endl; 

class Complex { 
public: 
    Complex(double = 0, double = 0); 
    void print() const { cout << real << '\t' << imag << '\n'; } 
    // Overloaded += 
    Complex& operator +=(const Complex&); 
    // Overloaded -= 
    Complex& operator -=(const Complex&); 
    // Overloaded *= 
    Complex& operator *=(const Complex&); 
    // Overloaded /= 
    Complex& operator /=(const Complex&); 
    double Re() const { return real; } 
    double Im() const { return imag; } 
private: 
    double real, imag; 
}; 

int main() 
{ 
    Complex x, y(2), z(3, 4.5), a(1, 2), b(3, 4); 
    x.print(); 
    y.print(); 
    z.print(); 
    y += z; 
    y.print(); 
    a *= b; 
    a.print(); 
    return 0; 
} 

Complex::Complex(double reel, double imaginary) 
{ 
    real = reel; 
    imag = imaginary; 
} 

// Return types that matches the one in the prototype = &Complex 
Complex& Complex::operator+=(const Complex& z) 
{ 
    real += z.Re(); 
    imag += z.Im(); 
    //How to get an object to refer to itself 
    return *this; 
} 
Complex& Complex::operator *= (const Complex& z) 
{ 
    real *= (z.Re()); 
    imag *= z.Re(); 
    return *this; 
} 

答えて

2

あなたはstd::tiestd::make_tupleを使用して複数の割り当てを行うことができます。

std::tie(real, imag) = std::make_tuple(real*z.real - imag*z.imag, 
             real*z.imag + imag*z.real); 
return *this; 
+1

このソリューションはとてもPythonesqueです... – StoryTeller

+0

それは基本的に '*この= *この* z'の変種です。しばしば '*'を '* ='の形で表現しますが、ここでは逆の意味があります。 – MSalters

関連する問題