寻求大家帮忙 C++ 构造函数实现类型转换 为什么我的程序里不能转换呢?

nenkeer 2009-04-18 07:02:44
编译的时候总是报错,请大家帮帮我 谢谢!!


#include<iostream>
using namespace std;
class Rational
{
public:
Rational(long num=0,long den=1);
Rational(double a);
virtual ~Rational(void);
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
}

Rational::Rational(long num,long den)
{
if(den==0)
cout<<"分母不能为零!";
else if(num!=0)
{
this->num=num;
this->den=den;
}
}

Rational operator*(Rational& a,Rational& b)
{
Rational c(a.num*b.num,a.den*b.den);
return c;
}
Rational::Rational(double a)
{
long N=100000;
num=(long)(a*N);
den=1*N;
}

int main()
{
Rational a(1,5),b;
b=a+3.0; //错误的地方,+运算符重载没有可接受右运算符为double的操作(或没有可以接受的转换)
return 0;
}

...全文
166 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
ALLOHA1984 2009-04-20
  • 打赏
  • 举报
回复
重载一下 对象与double的相加 Rational operator+(const Rational& a,const double& b);
nenkeer 2009-04-20
  • 打赏
  • 举报
回复
谢谢大家啦!!
nenkeer 2009-04-20
  • 打赏
  • 举报
回复
2. 你的调用是a+3.0, 3.0 是一个const, 虽然它的+实现通过一个Rational(double a); 来构建了临时变量
但它的本质还是const,不可更改, 所以friend + 函数要带const


噢 明白了!!!
hjjdebug 2009-04-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nenkeer 的回复:]
引用 11 楼 beyond071 的回复:
奇怪的是 我在VS2008下运行楼主的代码并没有问题啊?
只是virtual ~Rational(void);没找到实现而已,加了个{} 就可以用了。


我上面贴的已经是修改过的啦 哈哈 只是不明白为什么要加const才能运行
C/C++ codeRationaloperator+(constRational&a,constRational&b)//重载运算符+ 把参数列表中的const去掉就不行的{
Rational c(a.num*b.den+b.num*a.den,a.den*b.den);returnc;
}
[/Quote]
这有两点需要明确
1. 你的friend + 声明是const ,所以函数实现也要是const, 声明和实现参数要统一
2. 你的调用是a+3.0, 3.0 是一个const, 虽然它的+实现通过一个Rational(double a); 来构建了临时变量
但它的本质还是const,不可更改, 所以friend + 函数要带const
zgjxwl 2009-04-19
  • 打赏
  • 举报
回复
那应该是3.0被隐式转换为常对象了。所以形参必须用 const的吧。

要么,你再重载一个+吧。免得需要类型转换
friend Rational operator+(const Rational& a,const double& b);
beyond071 2009-04-19
  • 打赏
  • 举报
回复
奇怪的是 我在VS2008下运行楼主的代码并没有问题啊?
只是virtual ~Rational(void);没找到实现而已,加了个{} 就可以用了。
nenkeer 2009-04-19
  • 打赏
  • 举报
回复
换成对象是没问题 可是我们要求就用3.0啊。。。好郁闷。。
zgjxwl 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 nenkeer 的回复:]
引用 11 楼 beyond071 的回复:
奇怪的是 我在VS2008下运行楼主的代码并没有问题啊?
只是virtual ~Rational(void);没找到实现而已,加了个{} 就可以用了。


我上面贴的已经是修改过的啦 哈哈 只是不明白为什么要加const才能运行

C/C++ code
Rational operator+(const Rational& a,const Rational& b) //重载运算符+ 把参数列表中的const去掉就不行的
{
Rational c(a.num*b.den+b.num*a.den,a.den*b.d…
[/Quote]
应该是3.0惹的祸吧。。你不要用3.0,把它替换为另一个对象相加。。看看
nenkeer 2009-04-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 beyond071 的回复:]
奇怪的是 我在VS2008下运行楼主的代码并没有问题啊?
只是virtual ~Rational(void);没找到实现而已,加了个{} 就可以用了。
[/Quote]

我上面贴的已经是修改过的啦 哈哈 只是不明白为什么要加const才能运行

Rational operator+(const Rational& a,const Rational& b) //重载运算符+ 把参数列表中的const去掉就不行的
{
Rational c(a.num*b.den+b.num*a.den,a.den*b.den);
return c;
}

nenkeer 2009-04-19
  • 打赏
  • 举报
回复
UP!求助!
pengzhixi 2009-04-18
  • 打赏
  • 举报
回复
写成模板吧,不然你得为每个组合写个operator+()
nenkeer 2009-04-18
  • 打赏
  • 举报
回复
呃 。。我再把我的程序贴一下吧
#include <iostream>
using namespace std;
class Rational
{
public:
Rational(long num=0,long den=1);
Rational(double a);
virtual ~Rational(void);
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
};

Rational::Rational(long num,long den)
{
if(den==0)
cout < <"分母不能为零!";
else if(num!=0)
{
this->num=num;
this->den=den;
}
}

Rational operator+(const Rational& a,const Rational& b) //重载运算符+
{
Rational c(a.num*b.den+b.num*a.den,a.den*b.den);
return c;
}

Rational::Rational(double a) //可以实现隐式转换的构造函数
{
long N=100000;
num=(long)(a*N);
den=1*N;
}

int main()
{
Rational a(1,5),b;
b=a+3.0; //错误的地方,+运算符重载没有可接受右运算符为double的操作(或没有可以接受的转换)
return 0;
}

nenkeer 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 firsthym 的回复:]
引用 5 楼 hairetz 的回复:
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
}


你的+重载的运算符,只有2个Rational类的情况,并没有重载一个Rational+一个 double数据.
建议写成模板吧.

LZ是想使用全局的的operator+吧,不过你想将一个全局的operator+用于你自己的类,是不行的。
[/Quote]

我没有重载一个Rational+一个 double数据的 ,可是我定义了一个构造函数 应该可以实现隐式转换啊。。
是全局的operator+ 不过我已经在类里声明成友元函数了。。应该就可以使用了吧
nenkeer 2009-04-18
  • 打赏
  • 举报
回复
啊!我把重载的*贴上去了。。。贴错了。。不好意思啊各位 嘿嘿
重载+的实现应该是这个:

Rational operator+(const Rational& a,const Rational& b)
{
Rational c(a.num*b.den+b.num*a.den,a.den*b.den);
return c;
}
firsthym 2009-04-18
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hairetz 的回复:]
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
}


你的+重载的运算符,只有2个Rational类的情况,并没有重载一个Rational+一个 double数据.
建议写成模板吧.
[/Quote]
LZ是想使用全局的的operator+吧,不过你想将一个全局的operator+用于你自己的类,是不行的。
  • 打赏
  • 举报
回复
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
}


你的+重载的运算符,只有2个Rational类的情况,并没有重载一个Rational+一个 double数据.
建议写成模板吧.
weixiaoshashou 2009-04-18
  • 打赏
  • 举报
回复
你那个重载运算时那样的么?
Jamy325 2009-04-18
  • 打赏
  • 举报
回复
friend Rational operator+(const Rational& a,const Rational& b);
没有实现 ```
mengde007 2009-04-18
  • 打赏
  • 举报
回复
说的很清楚啊;a是个对象;3.0是个数字,没有运算符重载嘛;
cyldf 2009-04-18
  • 打赏
  • 举报
回复

class Rational
{
public:
Rational(long num=0,long den=1);
Rational(double a);
virtual ~Rational(void);
friend Rational operator+(const Rational& a,const Rational& b);
private:
long num; //分子
long den; //分母
} //此处少了;

b=a+3.0; //错误的地方,+运算符重载没有可接受右运算符为double的操作(或没有可以接受的转换)
你根本都没有重载operator +,肯定报错阿

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧