I have a template class for complex number. I made there some working operator like: <<, ==, =, /,,+,-,+=,-+,=.
I have a problem with /=. I tried to write the method. But the code is not working well. The method returns wrong value.
Can you have a look at my code and look why my method /= is not working?
This is the method /=:
//OPERATOR /=
template<class T>
Zespolona<T> Zespolona<T>::operator /=(const Zespolona<T>& obj)
{
Zespolona<T> temp;
temp.reNum = ((reNum * obj.reNum) + (imNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
temp.imNum = ((obj.reNum * imNum) - (reNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
return temp;
}
Rest of the code:
#include <iostream>
using namespace std;
template <class T>
class Zespolona {
private:
//Zmienne prywatne
T reNum;
T imNum;
public:
//Deklaracja konstruktorów
Zespolona();
Zespolona(T re);
Zespolona(T re, T im);
//Deklaracja operatorów
Zespolona<T> operator+(const Zespolona<T>&)const;
Zespolona<T> operator-(const Zespolona<T>&)const;
Zespolona<T> operator*(const Zespolona<T>&)const;
Zespolona<T> operator/(const Zespolona<T>&)const;
Zespolona<T> operator+=(const Zespolona<T>&);
Zespolona<T> operator-=(const Zespolona<T>&);
Zespolona<T> operator*=(const Zespolona<T>&);
Zespolona<T> operator/=(const Zespolona<T>&);
Zespolona<T> operator=(const Zespolona<T>&);
bool operator==(const Zespolona&) const;
template <class U>
friend ostream& operator<<(ostream&, const Zespolona<U>&);
};
//Konstruktor bez argumetów
template<class T>
Zespolona<T>::Zespolona()
{
reNum = 0.0;
imNum = 0.0;
}
//Konstruktor z jednym argumentem
template<class T>
Zespolona<T>::Zespolona(const T re)
{
reNum = re;
imNum = 0.0;
}
//Konstruktor z dwoma argumentami
template<class T>
Zespolona<T>::Zespolona(const T re, const T im)
{
reNum = re;
imNum = im;
}
//DODAWANIE
template<class T>
Zespolona<T> Zespolona<T>::operator +(const Zespolona<T>& obj) const
{
Zespolona<T> temp;
temp.reNum = reNum + obj.reNum;
temp.imNum = imNum + obj.imNum;
return temp;
}
//ODEJMOWANIE
template<class T>
Zespolona<T> Zespolona<T>::operator -(const Zespolona<T>& obj) const
{
Zespolona<T> temp;
temp.reNum = reNum - obj.reNum;
temp.imNum = imNum - obj.imNum;
return temp;
}
//MNOZENIE
template<class T>
Zespolona<T> Zespolona<T>::operator *(const Zespolona<T>& obj) const
{
Zespolona<T> temp;
temp.reNum = (reNum * obj.reNum) - (imNum * obj.imNum);
temp.imNum = (reNum * obj.imNum) + (imNum * obj.reNum);
return temp;
}
//DZIELENIE
template<class T>
Zespolona<T> Zespolona<T>::operator /(const Zespolona<T>& obj) const
{
Zespolona<T> temp;
temp.reNum = ((reNum * obj.reNum) + (imNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
temp.imNum = ((obj.reNum * imNum) - (reNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
return temp;
}
//OPERATOR PORÓWNANIA
template <class T>
bool Zespolona<T>::operator ==(const Zespolona& obj) const
{
return (reNum == obj.reNum && imNum == obj.imNum);
}
//OPERATOR =
template <class T>
Zespolona<T> Zespolona<T>::operator=(const Zespolona& obj)
{
if (this != &obj)
{
reNum = obj.reNum;
imNum = obj.imNum;
}
return *this;
}
//OPERATOR +=
template<class T>
Zespolona<T> Zespolona<T>::operator +=(const Zespolona<T>& obj)
{
reNum += obj.reNum;
imNum += obj.imNum;
return *this;
}
//OPERATOR -=
template<class T>
Zespolona<T> Zespolona<T>::operator -=(const Zespolona<T>& obj)
{
reNum -= obj.reNum;
imNum -= obj.imNum;
return *this;
}
//OPERATOR *=
template<class T>
Zespolona<T> Zespolona<T>::operator *=(const Zespolona<T>& obj)
{
reNum = (reNum * obj.reNum) - (reNum * obj.imNum);
imNum = (imNum * obj.reNum) + (imNum * obj.imNum);
return *this;
}
//OPERATOR /=
template<class T>
Zespolona<T> Zespolona<T>::operator /=(const Zespolona<T>& obj)
{
Zespolona<T> temp;
temp.reNum = ((reNum * obj.reNum) + (imNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
temp.imNum = ((obj.reNum * imNum) - (reNum * obj.imNum)) / ((pow(obj.reNum, 2.0)) + (pow(obj.imNum, 2.0)));
return temp;
}
//OPERATOR WEJSCIA
template<class T>
ostream& operator<<(ostream& out, const Zespolona<T>& zesp)
{
out << zesp.reNum;
out << "+";
out << zesp.imNum;
out << "i";
return out;
}
//funkcja testująca
void test() {
try {
Zespolona<double> a(1.0, 2.1);
Zespolona<double> b(0.8, 1.7);
Zespolona<double> c;
cout << a << " + " << b << " = " << a + b << endl;
cout << a << " * " << b << " = " << a * b << endl;
cout << a << " == " << b << " = " << (a == b) << endl;
c = a;
cout << a << " == " << c << " = " << (a == c) << endl;
c = Zespolona<double>(1.0, 1.0);
}
catch (const char *e) {
cout << "Exception: " << e << endl;
}
catch (const exception &e) {
cout << "Exception: " << e.what() << endl;
}
catch (...) {
cout << "Caught not expected exception" << endl;
}
}
int main() {
Zespolona<double> x(1.0, 1.0);
Zespolona<double> z(0.5, 1.0);
cout << x / z << endl;
x /= z;
cout << x << endl;
//test();
system("pause");
}