Solved

Overloading the = operator for my complex number class in c++

Posted on 2007-11-24
11
469 Views
Last Modified: 2013-12-14
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
0
Comment
Question by:urobins
  • 6
  • 5
11 Comments
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20344689
>>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
 

Author Comment

by:urobins
ID: 20344693
So I could overload it to pass a complex number ?

like Complex number1, number2;
number1=number2?

Is that possible?

0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20344702
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
 

Author Comment

by:urobins
ID: 20344708
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
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20344710
Still you can post after closing a question.
0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 

Author Comment

by:urobins
ID: 20344719
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
 
LVL 55

Accepted Solution

by:
Jaime Olivares earned 500 total points
ID: 20344741
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
 

Author Comment

by:urobins
ID: 20344746
ah, thanks, Just out of curiuosity why do I remove the ampersnad?
0
 

Author Closing Comment

by:urobins
ID: 31410822
Awesome Job thanks!
0
 
LVL 55

Expert Comment

by:Jaime Olivares
ID: 20344757
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
 

Author Comment

by:urobins
ID: 20344760
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

Featured Post

What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

Join & Write a Comment

IntroductionThis article is the second in a three part article series on the Visual Studio 2008 Debugger.  It provides tips in setting and using breakpoints. If not familiar with this debugger, you can find a basic introduction in the EE article loc…
This article shows you how to optimize memory allocations in C++ using placement new. Applicable especially to usecases dealing with creation of large number of objects. A brief on problem: Lets take example problem for simplicity: - I have a G…
The goal of this video is to provide viewers with basic examples to understand how to create, access, and change arrays in the C programming language.
THe viewer will learn how to use NetBeans IDE 8.0 for Windows to perform CRUD operations on a MySql database.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now