新微赢技术网
标题:
关于重载后缀++的问题
[打印本页]
作者:
枫之泪-天涯
时间:
2009-11-3 03:32
标题:
关于重载后缀++的问题
我做了一个分数类,里面用到一个后缀++
const Fraction& Fraction::operator++ (int)
{
const Fraction saveObject(*this);
numerator+=denominator;//(分子=分子+分母)
return saveObject;
}
我在主函数中
Fraction fr1(1,5);
Fraction fr2;
fr2=fr1++;
fr1.print();
fr2.print();
显示结果 第一个为6/5 与预想的一样
而第二个 却显示了-8766787/8766787 //是个地址(应该显示1/5)
原来在编译时,在 return saveObject;这行中有一个警告,如下
D:\C++平台控制台程序\fenshu.cpp(82) : warning C4172: returning address of local variable or temporary
请高手帮我解释一下,以及正确改法
作者:
╰☆惢棂擱淺
时间:
2009-11-3 03:32
以下是引用elitiwin在2006-6-30 22:14:20的发言:
我做了一个分数类,里面用到一个后缀++
const Fraction& Fraction::operator++ (int)
{
const Fraction saveObject(*this); //你这里用对象的指针来初始化一个对象,他是一个局部变量,return 的结果是不可预测的
numerator+=denominator;//(分子=分子+分母)
return saveObject;
}
我在主函数中
Fraction fr1(1,5);
Fraction fr2;
fr2=fr1++;
fr1.print();
fr2.print();
显示结果 第一个为6/5 与预想的一样
而第二个 却显示了-8766787/8766787 //是个地址(应该显示1/5)
原来在编译时,在 return saveObject;这行中有一个警告,如下
D:\C++平台控制台程序\fenshu.cpp(82) : warning C4172: returning address of local variable or temporary
请高手帮我解释一下,以及正确改法
作者:
渴望光明
时间:
2009-11-3 03:32
那么该如何改啊,大家帮帮忙
作者:
cs牛人
时间:
2009-11-3 03:32
Fraction Fraction::operator++ (int)
{
Fraction temp;temp=*this;
numerator+=denominator;//(分子=分子+分母)
return temp;
}
这样就可以了
作者:
停淼心泪
时间:
2009-11-3 03:32
运行了一下,还是不行.以下是原代码.请看:
#include <iostream>
using namespace std;
class Fraction
{
private:
int numerator;
int denominator;
int greateComDiv(int n1,int n2);
public:
Fraction();
Fraction(int numer);
Fraction(int numer,int denom);
Fraction(const Fraction& copyFrom);
~Fraction() {}
void store(int numer,int denom);
inline void print() const;
const Fraction& operator++();
const Fraction& operator++(int);
Fraction& operator=(const Fraction& fr);
void operator+=(const Fraction& fr2);
operator float() const;
};
Fraction::Fraction()
{
numerator=0;
denominator=1;
}
Fraction::Fraction(int numer)
{
numerator=numer;
denominator=1;
}
Fraction::Fraction(int numer,int denom)
{
if(denom==0)
{
cout<<"Error: denominator is zero"<<endl;
exit(100);
}
if(denom<0)
{
denom=-denom;
numer=-numer;
}
int gcd=greateComDiv(abs(numer),abs(denom));
numer=numer/gcd;
denom=denom/gcd;
numerator=numer;
denominator=denom;
}
Fraction::Fraction(const Fraction& copyFrom)
{
numerator=copyFrom.numerator;
denominator=copyFrom.denominator;
}
void Fraction::store(int numer,int denom)
{
*this=Fraction(numer,denom);
return;
}
void Fraction::print() const
{
cout<<numerator<<"/"<<denominator;
return;
}
const Fraction& Fraction::operator ++()
{
numerator+=denominator;
return(*this);
}
const Fraction& Fraction::operator++ (int)
{
Fraction temp;temp=*this;
numerator+=denominator;
return temp;
}
Fraction& Fraction::operator =(const Fraction& fr)
{
numerator=fr.numerator;
denominator=fr.denominator;
return *this;
}
Fraction::operator float() const
{
return (static_cast<float>(numerator)/denominator);
}
void Fraction::operator +=(const Fraction& fr2)
{
numerator=(numerator*fr2.denominator)
+(fr2.numerator*denominator);
denominator*=fr2.denominator;
*this=Fraction(numerator,denominator);
return;
}
int Fraction::greateComDiv(int n1,int n2)
{
if(n2==0)
return n1;
else
return greateComDiv(n2,n1%n2);
}
int main()
{
Fraction fr1(1,5);
Fraction fr2;
fr2=fr1++;
cout<<"Postfix Increment:\nOriginal fr1: ";
fr1.print();
cout<<"Expression Value:";
fr2.print();
cout<<"Incremented fr1:";
fr1.print();
cout<<endl;
fr1.store(1,5);
fr2=++fr1;
cout<<"\nPrefix Increment:\nOriginal fr1:";
fr1.print();
cout<<"Expression Value:";
fr2.print();
cout<<"Incremented fr1:";
fr1.print();
cout<<endl;
Fraction fr3=fr2=fr1=1;
cout<<"\nConversion & Assignment:\nOriginal fr1:";
fr1.print();
cout<<"fr2:";
fr2.print();
cout<<"fr3:";
fr3.print();
cout<<endl;
fr3.store(5,-10);
cout<<"\nConversion to Float:\nConverted value of ";
fr3.print();
cout<<" is ";
cout<<fr3<<endl;
return 0;
}
作者:
痴人痴想
时间:
2009-11-3 03:32
楼主的 返回值的引用& 没有去掉。 wfpb 4楼的没错。
作者:
劳资ぶ龍哥
时间:
2009-11-3 03:32
哦,粗心了,谢谢
欢迎光临 新微赢技术网 (http://bbs.weiying.cn/)
Powered by Discuz! X3.2