找回密码
 注册
搜索
热搜: 回贴
  • 前程无忧官网首页 有什么好的平台可以
  • 最新的销售平台 互联网营销的平台有哪
  • 制作网页的基本流程 网页制作和网页设
  • 【帝国CMS】输出带序号的列表(数字排
  • 网站建设公司 三一,中联,极东泵车的
  • 织梦 建站 织梦网站模版后台怎么更改
  • 云服务官网 哪些网站有免费的简历模板
  • 如何建网站要什么条件 建网站要用什么
  • 吉林市移动公司电话 吉林省退休人员网
  • 设计类毕业论文 网站设计与实现毕业论
查看: 1682|回复: 6

关于重载后缀++的问题

[复制链接]
发表于 2009-11-3 03:32:29 | 显示全部楼层 |阅读模式 IP:江苏扬州
我做了一个分数类,里面用到一个后缀++
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:30 | 显示全部楼层 IP:江苏扬州
以下是引用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:31 | 显示全部楼层 IP:江苏扬州
那么该如何改啊,大家帮帮忙
回复

使用道具 举报

发表于 2009-11-3 03:32:32 | 显示全部楼层 IP:江苏扬州
Fraction Fraction::operator++ (int)
{
Fraction temp;temp=*this;
numerator+=denominator;//(分子=分子+分母)
return temp;
}
这样就可以了
回复

使用道具 举报

发表于 2009-11-3 03:32:33 | 显示全部楼层 IP:江苏扬州
运行了一下,还是不行.以下是原代码.请看:
#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:34 | 显示全部楼层 IP:江苏扬州
楼主的 返回值的引用& 没有去掉。 wfpb 4楼的没错。
回复

使用道具 举报

发表于 2009-11-3 03:32:36 | 显示全部楼层 IP:江苏扬州
哦,粗心了,谢谢
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|最新主题|手机版|微赢网络技术论坛 ( 苏ICP备08020429号 )

GMT+8, 2024-9-30 13:17 , Processed in 0.185319 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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