【问题标题】:why is this sending an error about invalid initialization of reference为什么这会发送有关无效初始化引用的错误
【发布时间】:2014-10-26 00:28:49
【问题描述】:

此代码是一个分数,用于添加/减去分数的多个输入。这是我的头文件:

#ifndef FRACTION_H
#define FRACTION_H
#include <iostream>
using namespace std;


class Fraction{

    public: 
    Fraction(int , int );
    int fraction(int,int);
    void reduce_fraction(int *,  int *);
    Fraction& operator+(const Fraction&);
    Fraction& operator-(const Fraction&);
    friend ostream& operator<<(ostream &os, const  Fraction& n);
    friend istream& operator>>(istream &is, const Fraction& n);


};

#endif

这里是运算符代码的重载,这会导致从所有三个重载的“Frations”类型的右值中对“Fractions&”类型的非常量引用进行无效初始化的错误

Fraction& Fraction::operator+(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) + (n.denom * n.nump);
    return Fraction(numera,denom);
}

Fraction& Fraction::operator-(const Fraction& n) {
    int denom = *denomp * n.denom;
    int numera = (*nump * n.numera) - (n.denom* n.nump);
    return Fraction(numera, denom);
}
Fraction& Fraction::operator=(const Fraction& n){
    if(this==&n) return *this;
    return n;
}

【问题讨论】:

  • operator + 不应返回引用,operator - 也是如此。两者都应该返回一个按值copy。我建议阅读this question,尤其是关于算术重载的部分。
  • operator+ 不应返回引用,因为它在语义上毫无意义。但从技术上讲,问题在于非常量(左值)引用(您的返回类型)无法绑定到临时变量(右值,您返回的内容)。这两个问题都可以通过按值返回来解决。
  • 我是 C++ 新手,感谢您解释我不应该返回引用,但是您如何按值返回,我可以返回两个变量吗?

标签: c++ class operator-overloading


【解决方案1】:

您的赋值运算符返回Fraction &amp;

return n;

这是const Fraction &amp;

这是编译器抱怨的错误。当函数返回对非 const 对象的引用时,您正试图返回对 const 对象的引用。

【讨论】:

  • 所以我会修复它我删除常量,所以它会传递一个值
  • @truedisciple 您可能会修复编译器错误,但您的赋值运算符严重损坏。想想应该对对象执行什么赋值。
  • 换句话说:赋值运算符总是期望返回 *this。总是。你可以做一些有趣的事情,如果你检测到被分配的对象是同一个对象(这很少能以可移植的方式完成),但在所有情况下,你都应该返回 *this。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多