I try to make an exercise that involves classes. I reached until this point
#include <iostream>
#include<math.h>
#include<iomanip>
#include<conio.h>
using namespace std;
class Cplx {
double re, im;
public:
//constructors
Cplx(double x=0, double y=0);
Cplx(const Cplx& z);
//accessing the members
double real() const {return re;}
double imag() const {return im;}
//setting the members
void setreal(double x) {re=x;}
void setimag(double y) {im = y;}
//simple attribution
Cplx& operator+=(const Cplx& z);
Cplx& operator-=(const Cplx& z);
Cplx& operator*=(const Cplx& z);
Cplx& operator/=(const Cplx& z);
//module and argument
double mod (const Cplx z);
double arg (const Cplx z);
//input/output
friend istream& operator>>(istream& is, Cplx& z);
friend ostream& operator>>(ostream& is, const Cplx& z);
//binary operators
friend int operator == (const Cplx& s, const Cplx& d);
friend int operator != (const Cplx& s, const Cplx& d);
friend int operator + (const Cplx& s, const Cplx& d);
friend int operator - (const Cplx& s, const Cplx& d);
friend int operator * (const Cplx& s, const Cplx& d);
friend int operator / (const Cplx& s, const Cplx& d);
//unary operators
friend Cplx operator -(const Cplx& z);
friend Cplx operator !(const Cplx& z); //conjugat
friend Cplx operator ++(const Cplx& z); //prefix
friend Cplx operator ++( Cplx& z, int); //postfix
};
//implementing the class
Cplx::Cplx(double x, double y) {
re=x;
im=y;
}
Cplx::Cplx(const Cplx& z) {
re= z.real();
im= z.imag();
}
Cplx& Cplx::operator=(const Cplx& z){
if(&z != this) {
re= z.real();
im= z.imag();
}
return *this;
}
Cplx& Cplx::operator+=(const Cplx& z){
re += z.real();
im += z.imag();
return *this;
}
Cplx& Cplx::operator-=(const Cplx& z){
re -= z.real();
im -= z.imag();
return *this;
}
Cplx& Cplx::operator*=(const Cplx& z){
re= re*z.real() - im*z.imag();
im= re*z.imag() + im*z.real();
return *this;
}
Cplx& Cplx::operator/=(const Cplx& z){
double t = z.real()*z.real()+z.imag()*z.imag();
re= ( re*z.real() + im*z.imag()) /t;
im= (im*z.real() - re*z.imag()) /t;
return *this;
}
double Cplx::mod(const Cplx z) {
double x = z.real();
double y = z.imag();
return sqrt(x*x+y*y);
}
double Cplx::arg(const Cplx z) {
double x = z.real();
double y = z.imag();
return atan2(x, y);
}
istream& operator>>(istream& is, Cplx& z) {
double x, y;
is>>x>>y;
z.setreal(x);
z.setimag(y);
return is;
}
ostream& operator<<(ostream& os, const Cplx& z) {
os<< "("<<z.real() <<","<<z.imag() <<")" <<endl;
return os;
}
int operator == (const Cplx& s, const Cplx& d) {
return s.real() == d.real() && s.imag() == d.imag();
}
int operator != (const Cplx& s, const Cplx& d) {
return s.real() != d.real() || s.imag() != d.imag();
}
Cplx operator +(const Cplx& s, const Cplx& d) {
return Cplx(s.real()+d.real(), s.imag()+d.imag());
}
but here at the and of the code I receive an error
"cannot overload function distinguished by return type alone"
and I don't know how to get over it