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
urobinsAsked:
Who is Participating?
 
Jaime OlivaresSoftware ArchitectCommented:
it should be:

Complex Complex::operator=(const Complex& operand2 )
 {
      if (this != &operand2)
      {
            real = operand2.real;    // removed ampersand
            imaginary = operand2.imaginary;  // removed ampersand
      }

      return *this;
}

0
 
Jaime OlivaresSoftware ArchitectCommented:
>>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).
0
 
urobinsAuthor Commented:
So I could overload it to pass a complex number ?

like Complex number1, number2;
number1=number2?

Is that possible?

0
Cloud Class® Course: Amazon Web Services - Basic

Are you thinking about creating an Amazon Web Services account for your business? Not sure where to start? In this course you’ll get an overview of the history of AWS and take a tour of their user interface.

 
Jaime OlivaresSoftware ArchitectCommented:
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
0
 
urobinsAuthor Commented:
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?
0
 
Jaime OlivaresSoftware ArchitectCommented:
Still you can post after closing a question.
0
 
urobinsAuthor Commented:
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
0
 
urobinsAuthor Commented:
ah, thanks, Just out of curiuosity why do I remove the ampersnad?
0
 
urobinsAuthor Commented:
Awesome Job thanks!
0
 
Jaime OlivaresSoftware ArchitectCommented:
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.
0
 
urobinsAuthor Commented:
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!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.