| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 688 人关注过本帖
标题:关于重载后缀++的问题
只看楼主 加入收藏
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
收藏
 问题点数:0 回复次数:6 
关于重载后缀++的问题
我做了一个分数类,里面用到一个后缀++
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
请高手帮我解释一下,以及正确改法
搜索更多相关主题的帖子: Fraction 后缀 saveObject 重载 分子 
2006-06-30 22:14
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
以下是引用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
请高手帮我解释一下,以及正确改法


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-06-30 22:57
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
收藏
得分:0 

那么该如何改啊,大家帮帮忙

2006-07-01 08:01
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
Fraction Fraction::operator++ (int)
{
Fraction temp;temp=*this;
numerator+=denominator;//(分子=分子+分母)
return temp;
}
这样就可以了

[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-07-01 09:03
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
收藏
得分:0 


运行了一下,还是不行.以下是原代码.请看:
#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;
}

2006-07-01 09:55
woodhead
Rank: 3Rank: 3
等 级:新手上路
威 望:9
帖 子:1124
专家分:0
注 册:2005-7-18
收藏
得分:0 
楼主的 返回值的引用& 没有去掉。 wfpb 4楼的没错。

2006-07-01 10:35
elitiwin
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-5-28
收藏
得分:0 

哦,粗心了,谢谢

2006-07-01 12:39
快速回复:关于重载后缀++的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.073312 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved