“=”号重载时出错。单独的“a=b”没错,但是,"c=a+b"时就出错了。
#include<iostream.h>
class CFraction //分数类定义
{
private:
int denominator,numerator;
public:
CFraction(int a,int b)
{
numerator = a;
denominator = b;
}
CFraction()
{
// cin>>numerator>>denominator;
}
CFraction(const CFraction &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
CFraction & operator + (const CFraction &r_e)
{
CFraction e(* this);
e.numerator = r_e.numerator * e.denominator + e.numerator * r_e.denominator;
e.denominator *= r_e.denominator;
return e;
}
CFraction & operator - (const CFraction &r_e)
{
CFraction e(* this);
e.numerator = e.numerator * r_e.denominator - r_e.numerator * e.denominator;
e.denominator *= r_e.denominator;
return e;
}
CFraction & operator * (const CFraction &r_e)
{
CFraction e(* this);
e.denominator *= r_e.denominator;
e.numerator *= r_e.numerator;
return e;
}
CFraction & operator / (const CFraction &r_e)
{
CFraction e(* this);
e.denominator *= r_e.numerator;
e.numerator *= r_e.denominator;
return e;
}
void print()
{
cout<<numerator<<"/"<<denominator;
}
};
void main()
{
CFraction a(1,2),b(1,3);
CFraction result;
result = a+b;
result.print();
}
11 个解决方案
#1
#include <string>
#include <iostream>
using namespace std;
class CFraction //分数类定义
{
private:
int denominator,numerator;
public:
CFraction(int a,int b)
{
numerator = a;
denominator = b;
}
CFraction()
{
// cin>>numerator>>denominator;
}
CFraction(const CFraction &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
CFraction & operator + (const CFraction &r_e)
{
//CFraction e(* this);
numerator = r_e.numerator * denominator +numerator * r_e.denominator;
denominator *= r_e.denominator;
return *this;
}
CFraction & operator - (const CFraction &r_e)
{
//CFraction e(* this);
numerator = numerator * r_e.denominator - r_e.numerator * denominator;
denominator *= r_e.denominator;
return *this;
}
CFraction & operator * (const CFraction &r_e)
{
denominator *= r_e.denominator;
numerator *= r_e.numerator;
return *this;
}
CFraction & operator / (const CFraction &r_e)
{
denominator *= r_e.numerator;
numerator *= r_e.denominator;
return *this;
}
void print()
{
cout <<numerator <<"/" <<denominator;
}
};
void main()
{
CFraction a(1,2),b(1,3);
CFraction result;
result = a+b;
result.print();
}
#2
临时变量的引用太多了;
#3
CFraction & operator + (const CFraction &r_e)
{
CFraction e(* this);
e.numerator = r_e.numerator * e.denominator + e.numerator * r_e.denominator;
e.denominator *= r_e.denominator;
return e;
}
你这个CFraction e(* this);创建了一个本地的变量,然后用它来返回,函数体退出后,该变量就被清理了,所以在外部使用它一定出错。
改为双操作参数的加法重载友元函数
friend Fraction & operator + (const CFraction &a1, const CFraction &a2);这是正途,实现很简单,自己完成。
{
CFraction e(* this);
e.numerator = r_e.numerator * e.denominator + e.numerator * r_e.denominator;
e.denominator *= r_e.denominator;
return e;
}
你这个CFraction e(* this);创建了一个本地的变量,然后用它来返回,函数体退出后,该变量就被清理了,所以在外部使用它一定出错。
改为双操作参数的加法重载友元函数
friend Fraction & operator + (const CFraction &a1, const CFraction &a2);这是正途,实现很简单,自己完成。
#4
一楼的方法,把“+”左边的数修改了。
调试的时候,调用下面的函数时,发现“+”返回的e的确传递进去了,但是就是不能修改denominator的值,不知道为什么。。
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
试下3楼的方法。
调试的时候,调用下面的函数时,发现“+”返回的e的确传递进去了,但是就是不能修改denominator的值,不知道为什么。。
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
试下3楼的方法。
#5
我现在什么都不想说;无语……
#6
为了与内置的加法类型保持一致,重载加法返回的应该是一个右值,而不是一个引用。
CFraction operator + (const CFraction &a1, const CFraction &a2);
CFraction operator + (const CFraction &a1, const CFraction &a2);
#7
个人觉得你的+等操作符(除赋值操作符以外)不应该作为类的成员,应该在类外定义这些操作符,参数是两个CFraction类对象,再用其返回对象(也是一个CFraction类对象)作赋值操作符的形参赋值给需要的CFraction类对象,应该就能实现要求的c=a+b操作了(注意:这种方法要把操作符声明为CFraction的友元)。
一楼的方法会修改到原始数据,感觉不太好,又不是+=操作之类的。
一楼的方法会修改到原始数据,感觉不太好,又不是+=操作之类的。
#8
附上自己改的:
#include <iostream>
using namespace std;
class CFraction //分数类定义
{
private:
int denominator,numerator;
public:
CFraction(int a,int b)
{
numerator = a;
denominator = b;
}
CFraction()
{
// cin>>numerator>>denominator;
}
CFraction(const CFraction &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
CFraction & operator = (const CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
friend CFraction operator + (const CFraction&,const CFraction&);//注意声明友元
void print()
{
cout <<numerator <<"/" <<denominator;
}
};
CFraction operator+(const CFraction &e1,const CFraction &e2)
{
CFraction temp;
temp.denominator=e1.denominator*e2.denominator;
temp.numerator=e1.numerator*e2.denominator+e1.denominator*e2.numerator;
return temp;
}
int main()
{
CFraction a(1,2),b(1,3);
a.print();
cout<<endl;
b.print();
cout<<endl;
CFraction result;
result=a+b;
result.print();
return 0;
}
#10
学习啦。
#11
返回局部变量的应用 ,永远值得注意的问题
#1
#include <string>
#include <iostream>
using namespace std;
class CFraction //分数类定义
{
private:
int denominator,numerator;
public:
CFraction(int a,int b)
{
numerator = a;
denominator = b;
}
CFraction()
{
// cin>>numerator>>denominator;
}
CFraction(const CFraction &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
CFraction & operator + (const CFraction &r_e)
{
//CFraction e(* this);
numerator = r_e.numerator * denominator +numerator * r_e.denominator;
denominator *= r_e.denominator;
return *this;
}
CFraction & operator - (const CFraction &r_e)
{
//CFraction e(* this);
numerator = numerator * r_e.denominator - r_e.numerator * denominator;
denominator *= r_e.denominator;
return *this;
}
CFraction & operator * (const CFraction &r_e)
{
denominator *= r_e.denominator;
numerator *= r_e.numerator;
return *this;
}
CFraction & operator / (const CFraction &r_e)
{
denominator *= r_e.numerator;
numerator *= r_e.denominator;
return *this;
}
void print()
{
cout <<numerator <<"/" <<denominator;
}
};
void main()
{
CFraction a(1,2),b(1,3);
CFraction result;
result = a+b;
result.print();
}
#2
临时变量的引用太多了;
#3
CFraction & operator + (const CFraction &r_e)
{
CFraction e(* this);
e.numerator = r_e.numerator * e.denominator + e.numerator * r_e.denominator;
e.denominator *= r_e.denominator;
return e;
}
你这个CFraction e(* this);创建了一个本地的变量,然后用它来返回,函数体退出后,该变量就被清理了,所以在外部使用它一定出错。
改为双操作参数的加法重载友元函数
friend Fraction & operator + (const CFraction &a1, const CFraction &a2);这是正途,实现很简单,自己完成。
{
CFraction e(* this);
e.numerator = r_e.numerator * e.denominator + e.numerator * r_e.denominator;
e.denominator *= r_e.denominator;
return e;
}
你这个CFraction e(* this);创建了一个本地的变量,然后用它来返回,函数体退出后,该变量就被清理了,所以在外部使用它一定出错。
改为双操作参数的加法重载友元函数
friend Fraction & operator + (const CFraction &a1, const CFraction &a2);这是正途,实现很简单,自己完成。
#4
一楼的方法,把“+”左边的数修改了。
调试的时候,调用下面的函数时,发现“+”返回的e的确传递进去了,但是就是不能修改denominator的值,不知道为什么。。
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
试下3楼的方法。
调试的时候,调用下面的函数时,发现“+”返回的e的确传递进去了,但是就是不能修改denominator的值,不知道为什么。。
CFraction & operator = ( CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
试下3楼的方法。
#5
我现在什么都不想说;无语……
#6
为了与内置的加法类型保持一致,重载加法返回的应该是一个右值,而不是一个引用。
CFraction operator + (const CFraction &a1, const CFraction &a2);
CFraction operator + (const CFraction &a1, const CFraction &a2);
#7
个人觉得你的+等操作符(除赋值操作符以外)不应该作为类的成员,应该在类外定义这些操作符,参数是两个CFraction类对象,再用其返回对象(也是一个CFraction类对象)作赋值操作符的形参赋值给需要的CFraction类对象,应该就能实现要求的c=a+b操作了(注意:这种方法要把操作符声明为CFraction的友元)。
一楼的方法会修改到原始数据,感觉不太好,又不是+=操作之类的。
一楼的方法会修改到原始数据,感觉不太好,又不是+=操作之类的。
#8
附上自己改的:
#include <iostream>
using namespace std;
class CFraction //分数类定义
{
private:
int denominator,numerator;
public:
CFraction(int a,int b)
{
numerator = a;
denominator = b;
}
CFraction()
{
// cin>>numerator>>denominator;
}
CFraction(const CFraction &r)
{
denominator = r.denominator;
numerator = r.numerator;
}
CFraction & operator = (const CFraction &r_e)
{
denominator = r_e.denominator;
numerator = r_e.numerator;
return * this;
}
friend CFraction operator + (const CFraction&,const CFraction&);//注意声明友元
void print()
{
cout <<numerator <<"/" <<denominator;
}
};
CFraction operator+(const CFraction &e1,const CFraction &e2)
{
CFraction temp;
temp.denominator=e1.denominator*e2.denominator;
temp.numerator=e1.numerator*e2.denominator+e1.denominator*e2.numerator;
return temp;
}
int main()
{
CFraction a(1,2),b(1,3);
a.print();
cout<<endl;
b.print();
cout<<endl;
CFraction result;
result=a+b;
result.print();
return 0;
}
#9
请看看:
运算符重载小结
#10
学习啦。
#11
返回局部变量的应用 ,永远值得注意的问题