2016-07-03 10 views
-2

Мой Заголовочный файл:C++ ошибка копирования конструктора: Назначение члена 'Фракция :: числитель' только для чтения объекта

#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); 

}; 

Мой CPP файл:

#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; 
} 

Мои testcpp.file:

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

using namespace std; 

int main() 
{ 
    Fraction f1; 

    cout<<f1; 

    return 0; 
} 

Когда я запускаю этот код я получаю ниже error сообщение:

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: После того, как я ушел из конструктора копии копии и попытался, если остальная действительно работает, но я получаю то же error сообщений для оператор перегрузки (cin >>).

спасибо.

+2

Большая часть вашего кода не имеет значения. Вы должны отправить сообщение [mcve]. – juanchopanza

+0

Оператор '' '' '' не должен принимать параметр const, поскольку он меняет его (это то, что говорит компилятор). –

+0

Я откатил это назад, потому что ваши изменения полностью изменили вопрос. – juanchopanza

ответ

0

Избавьтесь от конструкции и поставьте ссылку. &symbol рядом с фракцией. Зачем? внести изменения в объект?

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; 
} 
2

Ваш конструктор копирования находится назад. Вы должны скопировать из параметризованного экземпляра в экземпляр this.

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

Было бы лучше использовать список инициализаторов ctor (или даже '= default' в этом случае) –

+0

И даже лучше, чтобы компилятор сделал это за вас. – juanchopanza

+0

Я отредактировал вопрос gents, не мог бы вы проверить его – mathquestion