-2

My Header file:

#include <iostream>
using namespace std;

class Fraction
{
private:
    double numerator;
    double denominator;
public:
    Fraction();
    ~Fraction();
    Fraction(const Fraction& c);
    Fraction(double,double);
    //setter
    void setNumerator(double newnumerator);
    void setDenominator(double newdenominator);
    //getter
    double getNumerator();
    double getDenominator();

    //friend overlaoding operators

    friend ostream& operator<<(ostream& os, Fraction f);

};

My CPP file:

#include <iostream>
#include "Fraction.h"

using namespace std;

Fraction::Fraction()
{
    cout<<"Empty constructor called"<<endl;
}

Fraction::~Fraction()
{
    cout<<"Deconstructor called"<<endl;
}

Fraction::Fraction(const Fraction& c)
{
    c.numerator = numerator;
    c.denominator = denominator;
}

Fraction::Fraction(double newnumerator, double newdenominator)
{
    numerator = newnumerator;
    denominator = newdenominator;
}

void Fraction::setNumerator(double newnumerator)
{
    numerator = newnumerator;
}

void Fraction::setDenominator(double newdenominator)
{
    denominator = newdenominator;
}

double Fraction::getNumerator()
{
    return numerator;
}

double Fraction::getDenominator()
{
    return denominator;
}

ostream& operator<<(ostream& os, Fraction f)
{
     os<<f.numerator<<"/"<<f.denominator<<endl;
     return os;
}

My testcpp.file:

#include <iostream>
#include "Fraction.h"

using namespace std;

int main()
{
    Fraction f1;

    cout<<f1;

    return 0;
}

When I run this code I get bellow error message:

Fraction.cpp: In copy constructor ‘Fraction::Fraction(const Fraction&)’: Fraction.cpp:20:17: error: assignment of member ‘Fraction::numerator’ in read-only object c.numerator = numerator;

Fraction.cpp:21:19: error: assignment of member ‘Fraction::denominator’ in read-only object c.denominator = denominator;

PS: Once I left out the copy copy constructor and tried if the rest really works, but I get the same error message for the overloading operator(cin >>).

Thank you very much.

juanchopanza
  • 223,364
  • 34
  • 402
  • 480

2 Answers2

2

Your copy constructor is backwards. You're supposed to copy FROM the parameterized instance to the this instance.

Fraction::Fraction(const Fraction& c)
{
    numerator = c.numerator;
    denominator = c.denominator;
}
xaxxon
  • 19,189
  • 5
  • 50
  • 80
0

get rid of the const and put a ref. &symbol next to Fraction. why? to make changes on the object ?

friend istream& operator>>(istream &is, Fraction &f);

istream& operator>>(istream &is, Fraction &)
{

    cout<<"Enter numerator"<<endl;
    is>>f.numerator;
    cout<<"Enter denominator"<<endl;
    is>>f.denominator;

    return is;
}