urobins
asked on
Overloading the = operator for my complex number class in c++
I am working on an assignment for my c++ class where I am doing operator overloading. I have everything working but the = operator, I am not sure how to make it work. I need to be able to do something like Complex myNumber = 4.4 5.5 and have it store that. I have attached my code below.
I am being told too many identifiers on my = code... can you see aproblem?
#include <iostream>
using std::cout;
#include"complex1.h"// Complex class definition
// constructor
Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{
// empty body
} // end Complex constructor
// addition operator
Complex Complex::operator+( const Complex &operand2 ) const
{
return Complex( real + operand2.real,
imaginary + operand2.imaginary );
} // end function operator+
// subtraction operator
Complex Complex::operator-( const Complex &operand2 ) const
{
return Complex( real - operand2.real,
imaginary - operand2.imaginary );
} // end function operator-
// I used the algorhthym posted in our conference. I had something similar but my parens were off I think :)
Complex Complex::operator*( const Complex &operand2 ) const
{
return Complex( ((real * operand2.real)-(imaginary * operand2.imaginary)), ((real * operand2.imaginary)+(opera nd2.real * imaginary)) );
} // end function operator*
Complex Complex::operator=( const double realPart, const double imaginaryParft, const Complex& complexNumber ) const
{
complexNumber.getReal(real Par);
complexNumber.getImaginary (imaginary Part);
return complexNumber
}
std::ostream& operator<<(std::ostream& stream,const Complex& complexNumber)
{
stream << "(" << complexNumber.getReal() << " , " << complexNumber.getImaginary ()<<")" << std::endl;
return stream;
}
std::istream& operator>>(std::istream& stream,Complex& value)
{
double realPart, imaginaryPart;
stream >> realPart >> imaginaryPart;
value.getReal(realPart);
value.getImaginary(imagina ryPart);
return stream;
}
bool Complex::operator==( const Complex &operand2 ) const
{
if (real == operand2.real && imaginary == operand2.imaginary)
return true;
else
return false;
}
bool Complex::operator!=( const Complex &operand2 ) const
{
if (real != operand2.real || imaginary != operand2.imaginary)
return true;
else
return false;
}
-------------------------- -----
#ifndef COMPLEX1_H
#define COMPLEX1_H
class Complex {
public:
Complex( double = 0.0, double = 0.0 ); // constructor
Complex operator+( const Complex & ) const; // addition
Complex operator-( const Complex & ) const; // subtraction
Complex operator*( const Complex &operand2 ) const; // Multiplication
Complex operator=( const double realPart, const double imaginaryParft, const Complex& complexNumber );
bool operator==( const Complex &operand2 ) const;
bool operator!=( const Complex &operand2 ) const;
friend std::ostream &operator<<(std::ostream &stream, const Complex &value);
friend std::istream &operator>>(std::istream &stream, Complex &value);
//accessor functions
double getReal() const { return real; }
double getImaginary() const { return imaginary; }
void getReal(double r) { real = r; }
void getImaginary(double i) { imaginary = i; }
private:
double real; // real part
double imaginary; // imaginary part
}; // end class Complex
#endif
I am being told too many identifiers on my = code... can you see aproblem?
#include <iostream>
using std::cout;
#include"complex1.h"// Complex class definition
// constructor
Complex::Complex( double realPart, double imaginaryPart )
: real( realPart ),
imaginary( imaginaryPart )
{
// empty body
} // end Complex constructor
// addition operator
Complex Complex::operator+( const Complex &operand2 ) const
{
return Complex( real + operand2.real,
imaginary + operand2.imaginary );
} // end function operator+
// subtraction operator
Complex Complex::operator-( const Complex &operand2 ) const
{
return Complex( real - operand2.real,
imaginary - operand2.imaginary );
} // end function operator-
// I used the algorhthym posted in our conference. I had something similar but my parens were off I think :)
Complex Complex::operator*( const Complex &operand2 ) const
{
return Complex( ((real * operand2.real)-(imaginary * operand2.imaginary)), ((real * operand2.imaginary)+(opera
} // end function operator*
Complex Complex::operator=( const double realPart, const double imaginaryParft, const Complex& complexNumber ) const
{
complexNumber.getReal(real
complexNumber.getImaginary
return complexNumber
}
std::ostream& operator<<(std::ostream& stream,const Complex& complexNumber)
{
stream << "(" << complexNumber.getReal() << " , " << complexNumber.getImaginary
return stream;
}
std::istream& operator>>(std::istream& stream,Complex& value)
{
double realPart, imaginaryPart;
stream >> realPart >> imaginaryPart;
value.getReal(realPart);
value.getImaginary(imagina
return stream;
}
bool Complex::operator==( const Complex &operand2 ) const
{
if (real == operand2.real && imaginary == operand2.imaginary)
return true;
else
return false;
}
bool Complex::operator!=( const Complex &operand2 ) const
{
if (real != operand2.real || imaginary != operand2.imaginary)
return true;
else
return false;
}
--------------------------
#ifndef COMPLEX1_H
#define COMPLEX1_H
class Complex {
public:
Complex( double = 0.0, double = 0.0 ); // constructor
Complex operator+( const Complex & ) const; // addition
Complex operator-( const Complex & ) const; // subtraction
Complex operator*( const Complex &operand2 ) const; // Multiplication
Complex operator=( const double realPart, const double imaginaryParft, const Complex& complexNumber );
bool operator==( const Complex &operand2 ) const;
bool operator!=( const Complex &operand2 ) const;
friend std::ostream &operator<<(std::ostream &stream, const Complex &value);
friend std::istream &operator>>(std::istream &stream, Complex &value);
//accessor functions
double getReal() const { return real; }
double getImaginary() const { return imaginary; }
void getReal(double r) { real = r; }
void getImaginary(double i) { imaginary = i; }
private:
double real; // real part
double imaginary; // imaginary part
}; // end class Complex
#endif
ASKER
So I could overload it to pass a complex number ?
like Complex number1, number2;
number1=number2?
Is that possible?
like Complex number1, number2;
number1=number2?
Is that possible?
yes, you can.
I cannot provide a direct answer for your question because it is a homework, but you can learn from this similar example and adapt to your needs:
http://www.fredosaurus.com/notes-cpp/oop-overloading/overloadassign.html
I cannot provide a direct answer for your question because it is a homework, but you can learn from this similar example and adapt to your needs:
http://www.fredosaurus.com/notes-cpp/oop-overloading/overloadassign.html
ASKER
Thanks, I'll have a look at this, do you mind if I leave the question open in case I have a question after modifying my code?
Still you can post after closing a question.
ASKER
Looking at the example you provided I tried this... but when I try to compile I get this error... Am I trying to access this wrong?
complex1.cpp(48) : error C2440: '=' : cannot convert from 'const double *__w64 ' to 'double'
1> There is no context in which this conversion is possible
complex1.cpp(49) : error C2440: '=' : cannot convert from 'const double *__w64 ' to 'double'
1> There is no context in which this conversion is possible
Complex Complex::operator=(const Complex& operand2 )
{
if (this != &operand2)
{
real = &operand2.real;
imaginary=&operand2.imagin ary;
}
return *this;
}
New Header file after change
#ifndef COMPLEX1_H
#define COMPLEX1_H
class Complex {
public:
Complex( double = 0.0, double = 0.0 ); // constructor
Complex operator+( const Complex & ) const; // addition
Complex operator-( const Complex & ) const; // subtraction
Complex operator*( const Complex &operand2 ) const; // Multiplication
Complex operator=( const Complex& operand2 );
bool operator==( const Complex &operand2 ) const;
bool operator!=( const Complex &operand2 ) const;
friend std::ostream &operator<<(std::ostream &stream, const Complex &value);
friend std::istream &operator>>(std::istream &stream, Complex &value);
//accessor functions
double getReal() const { return real; }
double getImaginary() const { return imaginary; }
void getReal(double r) { real = r; }
void getImaginary(double i) { imaginary = i; }
private:
double real; // real part
double imaginary; // imaginary part
}; // end class Complex
#endif
complex1.cpp(48) : error C2440: '=' : cannot convert from 'const double *__w64 ' to 'double'
1> There is no context in which this conversion is possible
complex1.cpp(49) : error C2440: '=' : cannot convert from 'const double *__w64 ' to 'double'
1> There is no context in which this conversion is possible
Complex Complex::operator=(const Complex& operand2 )
{
if (this != &operand2)
{
real = &operand2.real;
imaginary=&operand2.imagin
}
return *this;
}
New Header file after change
#ifndef COMPLEX1_H
#define COMPLEX1_H
class Complex {
public:
Complex( double = 0.0, double = 0.0 ); // constructor
Complex operator+( const Complex & ) const; // addition
Complex operator-( const Complex & ) const; // subtraction
Complex operator*( const Complex &operand2 ) const; // Multiplication
Complex operator=( const Complex& operand2 );
bool operator==( const Complex &operand2 ) const;
bool operator!=( const Complex &operand2 ) const;
friend std::ostream &operator<<(std::ostream &stream, const Complex &value);
friend std::istream &operator>>(std::istream &stream, Complex &value);
//accessor functions
double getReal() const { return real; }
double getImaginary() const { return imaginary; }
void getReal(double r) { real = r; }
void getImaginary(double i) { imaginary = i; }
private:
double real; // real part
double imaginary; // imaginary part
}; // end class Complex
#endif
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
ah, thanks, Just out of curiuosity why do I remove the ampersnad?
ASKER
Awesome Job thanks!
because the ampersand means "the address of", so you are trying to assign the address of a value to a value, not value to value.
ASKER
oh, I was confused, I thought I always had to use the ampersand when working with values like that, but I see my error, thanks for your help, I appreciate you pointing me in teh right direction and not just giving me the answer!
You cannot do this. You can assign only one value (whatever type is it)
As a general rule, when you overload an operator you cannot modify the way it is used (precedence, association, etc).