C++ 在C+中双重重载istream和ostream运算符+;
我有一个分数类,它允许以c/d的形式输入分数。 我可以很好地输出和输入分数,但当我用下面显示的自定义函数修改分数时,它什么也不做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;
我有以下重载>>和您需要函数定义中的
&
,因为您需要通过引用传递,因为您正在修改`分数'
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;
}