NefariousOctopus
NefariousOctopus

Reputation: 857

C++ operator I/O overloading

I've encountered a strange problem while overloading << operator for a Complex class (The Complex class and overload function are not complete, but the meaning should be the same - BUT if you feel there is missing some important part, just prompt me ;-) ):

class Complex {
    float m_fReal;
    float m_fImaginary;
public:
    Complex();
    Complex(float real, float imaginary);
    Complex add(Complex) const;

    friend std::ostream& operator<< 
          (std::ostream& out, Complex cComplex);
};

Overload function:

std::ostream& operator<<(std::ostream& out, Complex cComplex) {
    out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
    return out;
}

Add function:

Complex Complex::add(Complex cComplex) const {
    return Complex (m_fReal + cComplex.m_fReal,
                    m_fImaginary + cComplex.m_fImaginary);
}

Function call in main:

Complex x(1,1), y(2,2);
cout << "x+y=" << x.add(y) << endl;

While the above works, this does not (only parts that differ).

Declaration in Complex class:

friend std::ostream& operator<< 
      (std::ostream& out, Complex& cComplex);

Definition:

std::ostream& operator<<(std::ostream& out, Complex& cComplex) {
    out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
    return out;
}

My intention was to pass the Complex class by reference. Can anybody explain to me, what went wrong in this code and why?

Upvotes: 2

Views: 104

Answers (2)

Mark B
Mark B

Reputation: 96281

You need to accept the object to output by const reference. You're accepting it as a non-const reference to which the return from add cannot be bound.

std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {

This design/behavior is to prevent mistakes where a function expects to mutate the value of a reference parameter, but the reference has been bound to an unnamed temporary object, in other words memory that can't be accessed again, rendering the changes pointless.

Upvotes: 4

Robert Blatner
Robert Blatner

Reputation: 81

Your definition should be

std::ostream& operator<<(std::ostream& out, const Complex& cComplex) {
  out << cComplex.m_fReal << " " << cComplex.m_fImaginary;
  return out;
}

cComplex needs to be const qualified for you to access its private variables using "."

Upvotes: 1

Related Questions