设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1669|回复: 6
打印 上一主题 下一主题

关于重载后缀++的问题

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-3 03:32:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做了一个分数类,里面用到一个后缀++
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
请高手帮我解释一下,以及正确改法
2#
发表于 2009-11-3 03:32:30 | 只看该作者
以下是引用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
请高手帮我解释一下,以及正确改法
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-3 03:32:31 | 只看该作者
那么该如何改啊,大家帮帮忙
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-3 03:32:32 | 只看该作者
Fraction Fraction::operator++ (int)
{
Fraction temp;temp=*this;
numerator+=denominator;//(分子=分子+分母)
return temp;
}
这样就可以了
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-3 03:32:33 | 只看该作者
运行了一下,还是不行.以下是原代码.请看:
#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;
}
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-3 03:32:34 | 只看该作者
楼主的 返回值的引用& 没有去掉。 wfpb 4楼的没错。
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-3 03:32:36 | 只看该作者
哦,粗心了,谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 19:27 , Processed in 0.150394 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表