【问题标题】:C++ copy constructor error: Assignment of member 'Fraction::numerator' in read-only objectC++ 复制构造函数错误:在只读对象中分配成员'Fraction::numerator'
【发布时间】:2016-07-03 07:47:29
【问题描述】:

我的头文件:

#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:在复制构造函数“Fraction::Fraction(const Fraction&)”中: Fraction.cpp:20:17:错误:在只读对象中分配成员“Fraction::numerator” c.numerator = numerator;

Fraction.cpp:21:19:错误:在只读对象中分配成员“Fraction::denominator” c.denominator = denominator;

PS:一旦我省略了复制复制构造函数并尝试了其余部分是否真的有效,但对于 重载运算符,我得到了相同的 error 消息(@ 987654329@)。

非常感谢。

【问题讨论】:

  • 您的大部分代码都是无关紧要的。你应该发一个minimal reproducible example
  • Your&gt;&gt; 运算符不应采用 const 参数,因为它会更改它(这是编译器告诉你的)。
  • 我回滚了,因为您的编辑完全改变了问题。

标签: c++ copy-constructor


【解决方案1】:

您的复制构造函数是倒退的。您应该从参数化实例复制到 this 实例。

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

【讨论】:

  • 最好使用ctor初始化器列表(在这种情况下甚至是= default
  • 最好让编译器为你做这件事。
  • 我编辑了问题,先生们,你能检查一下这个
  • @mathquestion 你在另一个函数中遇到了类似的问题...注意错误信息,它们会告诉你问题出在哪里
【解决方案2】:

去掉 const 并放一个 ref。 &amp;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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多