Link to home
Start Free TrialLog in
Avatar of urobins
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)+(operand2.real * imaginary)) );
 
 } // end function operator*

 Complex Complex::operator=( const double realPart, const double imaginaryParft, const Complex& complexNumber ) const
 {
      complexNumber.getReal(realPar);
      complexNumber.getImaginary(imaginaryPart);
      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(imaginaryPart);

      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
Avatar of Jaime Olivares
Jaime Olivares
Flag of Peru image

>>Complex myNumber = 4.4 5.5
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).
Avatar of urobins
urobins

ASKER

So I could overload it to pass a complex number ?

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
Avatar of urobins

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.
Avatar of urobins

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.imaginary;
      }

      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
Avatar of Jaime Olivares
Jaime Olivares
Flag of Peru image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of urobins

ASKER

ah, thanks, Just out of curiuosity why do I remove the ampersnad?
Avatar of urobins

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.
Avatar of urobins

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!