I'm writing a class for complex numbers and when I declare one of those, I must declare it before and only after I can assign to it an operation.
For example:
This works:
ComplexNumber Number;
Number = AnotherComplex + (or -) AgainAnotherComplex;
This doesn't work:
ComplexNumber Number = AnotherComplex + (or -) AgainAnotherComplex;
I leave here is the .h file:
#ifndef COMPLEX_NUMBERS_H_INCLUDED
#define COMPLEX_NUMBERS_H_INCLUDED
#include <iostream> // for std namespace
class ComplexNumber
{
public:
ComplexNumber();
ComplexNumber(float RealPart, float ImaginaryPart);
ComplexNumber(ComplexNumber &NewComplexNumber);
~ComplexNumber();
void SetRealPart(float RealPart);
void SetImaginaryPart(float ImaginaryPart);
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay);
friend std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput);
bool operator==(const ComplexNumber Complex);
bool operator!=(const ComplexNumber Complex);
private:
float RealPart;
float ImaginaryPart;
};
#endif // COMPLEX_NUMBERS_H_INCLUDED
And I also leave here the .cpp file:
#include "Complex Numbers.h"
ComplexNumber::ComplexNumber()
{
RealPart = 0;
ImaginaryPart = 0;
}
ComplexNumber::ComplexNumber(float RealPart, float ImaginaryPart)
{
SetRealPart(RealPart);
SetImaginaryPart(ImaginaryPart);
}
ComplexNumber::~ComplexNumber()
{
}
ComplexNumber::ComplexNumber(ComplexNumber &NewComplexNumber)
{
RealPart = NewComplexNumber.RealPart;
ImaginaryPart = NewComplexNumber.ImaginaryPart;
}
void ComplexNumber::SetRealPart(float RealPart)
{
this->RealPart=RealPart;
}
void ComplexNumber::SetImaginaryPart(float ImaginaryPart)
{
this->ImaginaryPart=ImaginaryPart;
}
ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart + Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart + Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2)
{
ComplexNumber TemporaryComplexNumber;
TemporaryComplexNumber.RealPart = Complex1.RealPart - Complex2.RealPart;
TemporaryComplexNumber.ImaginaryPart = Complex1.ImaginaryPart - Complex2.ImaginaryPart;
return TemporaryComplexNumber;
}
std::ostream & operator<<(std::ostream &output, const ComplexNumber &NumberToDsiplay)
{
if(NumberToDsiplay.ImaginaryPart > 0)
output << std::endl << NumberToDsiplay.RealPart << "+" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart < 0)
output << std::endl << NumberToDsiplay.RealPart << "" << NumberToDsiplay.ImaginaryPart << "i";
else if(NumberToDsiplay.ImaginaryPart == 0)
output << std::endl << NumberToDsiplay.RealPart << " (The imaginary part is equal to 0)";
return output;
}
std::istream & operator >>(std::istream &input, ComplexNumber &NumberToInput)
{
std::cout << "Enter the real part: ";
input >> NumberToInput.RealPart;
std::cout << "Enter the imaginary part: ";
input >> NumberToInput.ImaginaryPart;
}
bool ComplexNumber::operator==(const ComplexNumber Complex)
{
return RealPart==Complex.RealPart && ImaginaryPart==Complex.ImaginaryPart;
}
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
Just declare the copy constructor like
ComplexNumber( const ComplexNumber &NewComplexNumber);
^^^^^
Otherwise the compiler can not bind a non-constant reference to a temporary that is the result of the expression
AnotherComplex + (or -) AgainAnotherComplex
that invokes either of the operators
friend ComplexNumber operator+(const ComplexNumber Complex1, const ComplexNumber Complex2);
friend ComplexNumber operator-(const ComplexNumber Complex1, const ComplexNumber Complex2);
that in turn should be declared like
friend ComplexNumber operator+(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
friend ComplexNumber operator-(const ComplexNumber &Complex1, const ComplexNumber &Complex2);
that is the parameters should be referenced types.
And this operator definition
bool ComplexNumber::operator!=(const ComplexNumber Complex)
{
if(RealPart != Complex.RealPart && ImaginaryPart != Complex.ImaginaryPart)
return true;
else if(RealPart != Complex.RealPart && (!(ImaginaryPart != Complex.ImaginaryPart)))
return true;
else if(ImaginaryPart != Complex.ImaginaryPart && (!(RealPart != Complex.RealPart)))
return true;
return false;
}
does not make great sense.
Define it like
bool ComplexNumber::operator!=(const ComplexNumber &Complex) const
{
return not( *this == Complex );
}
Pay attention to the qualifier const
after the parameter list. The same qualifier you need to add to the operator ==
.