Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中双重重载istream和ostream运算符+;_C++_Class_Overloading_Ostream_Istream - Fatal编程技术网

C++ 在C+中双重重载istream和ostream运算符+;

C++ 在C+中双重重载istream和ostream运算符+;,c++,class,overloading,ostream,istream,C++,Class,Overloading,Ostream,Istream,我有一个分数类,它允许以c/d的形式输入分数。 我可以很好地输出和输入分数,但当我用下面显示的自定义函数修改分数时,它什么也不做 我有以下重载>>和您需要函数定义中的&,因为您需要通过引用传递,因为您正在修改`分数' void setEqualDen(Fraction &a, Fraction &b){ int tempa = a.den; int tempb = b.den; a.den *= tempb; b.den *= tempa;

我有一个分数类,它允许以c/d的形式输入分数。 我可以很好地输出和输入分数,但当我用下面显示的自定义函数修改分数时,它什么也不做


我有以下重载>>和您需要函数定义中的
&
,因为您需要通过引用传递,因为您正在修改`分数'

void setEqualDen(Fraction &a, Fraction &b){
    int tempa = a.den;
    int tempb = b.den;
    a.den *= tempb;
    b.den *= tempa;
    a.num *= tempb;
    b.num *= tempa;
}

您需要检查输入错误并跳过空白。我建议使用临时数字来包含第一个数字,因为它可以是整数或分子。需要在检测到“/”后进行区分

std::istream& operator>>(std::istream& inp, Fraction& f)
{
  int temp = 0;
  f.num = 0;
  f.den = 1;
  inp >> temp;  // Could be whole number or numerator.
  if (inp)
  {
    int whole = temp;
    int numerator = 0;
    inp >> numerator;
    if (!inp)
    {
      // Let's assume that the input failed because of the '/' symbol.
      numerator = temp;
      whole = 0;
      inp.clear();
    }
    else
    {
      inp.ignore(1000, '/'); // Skip over the '/'
    }
    int denominator = 1;
    inp >> denominator;
    if (denominator == 0) denominator = 1;
    numerator += whole * denominator;
    f.num = numerator;
    f.den = denominator;
  }
  return inp;
}

你说不工作是什么意思?如果你的意思是结果不是你所期望的,那是因为
setEqualDen
复制了它的参数,而不是引用它们。如果这不是问题所在,那么请解释您所说的双重重载是什么意思,并发布错误消息、预期输出等。您的输入函数因以下文本“1+/25”而失败。与其假设空白量,不如跳过它。您所说的“不工作”是什么意思?如果你的意思是结果不是你所期望的,那是因为setEqualDen复制了它的参数,而不是引用它们。如果这不是问题所在,那么请解释一下你所说的双重重载,并发布错误消息、预期输出等的含义。问题是,什么也没发生。它完全忽略了该函数。这可能会解决OP的问题,但没有理由将
setEqualDen
作为成员函数,因为它没有访问正在调用它的实例。@Praetorian-是的,这是一个很好的观点,这是不必要的。既然函数只对这个特定类有效,那么这里的首选项是什么?我会说,让它成为一个成员,这样你就可以移动类,而不用担心在另一个程序中重新创建函数。@TriHard8错误可能是他试图在没有
Fraction
实例的情况下调用它。它应该是与
Fraction
的命名空间相同的自由函数。Praetorian同意谷歌“免费功能改进封装”。你的回答应该得到表扬。我会在谷歌上搜索,以供我自己学习。我会将问题设置为由裁判官回答,但它还不起作用。流函数不允许其他函数工作。
setEqualDen(Fa, Fb);
    cout << "The fractions are " << Fa << " , " << Fb <<   
             endl;
void setEqualDen(Fraction &a, Fraction &b){
    int tempa = a.den;
    int tempb = b.den;
    a.den *= tempb;
    b.den *= tempa;
    a.num *= tempb;
    b.num *= tempa;
}
std::istream& operator>>(std::istream& inp, Fraction& f)
{
  int temp = 0;
  f.num = 0;
  f.den = 1;
  inp >> temp;  // Could be whole number or numerator.
  if (inp)
  {
    int whole = temp;
    int numerator = 0;
    inp >> numerator;
    if (!inp)
    {
      // Let's assume that the input failed because of the '/' symbol.
      numerator = temp;
      whole = 0;
      inp.clear();
    }
    else
    {
      inp.ignore(1000, '/'); // Skip over the '/'
    }
    int denominator = 1;
    inp >> denominator;
    if (denominator == 0) denominator = 1;
    numerator += whole * denominator;
    f.num = numerator;
    f.den = denominator;
  }
  return inp;
}