首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++初学遇到的有关问题,请。

2013-07-16 
C++初学遇到的问题,请高手指点。。#include iostream.hclass fraction{long numberalong denomilong gcd

C++初学遇到的问题,请高手指点。。
#include "iostream.h"
class fraction
{

long numbera;
long denomi;
long gcd(long a,long b);
public:
fraction()
{
numbera=0;
denomi=1;


}
fraction(long a,long b=1);
  
void disp();
fraction operator+(fraction &dt2);
fraction operator+(long dt2);
    fraction operator-(long dt1,fraction &dt2);

};

fraction::fraction(long a,long b)
{
long wk;
if(b<=0)
b=1;
wk=gcd(a,b);
numbera=a/wk;
denomi=b/wk;

}

fraction fraction::operator+(fraction &dt2)
{
long mul1,mul2;
mul1=numbera*dt2.denomi+dt2.numbera*denomi;
mul2=denomi*dt2.denomi;
return fraction(mul1,mul2);

}

fraction fraction::operator+(long dt2)
{
return fraction(numbera+denomi*dt2,denomi);

}

long fraction::gcd(long a,long b)
{
long wk;
while(b!=0)
{
a=a%b;
wk=a;
a=b;
b=wk;
}
return a;

}
void fraction::disp()
{
cout<<numbera<<"/"<<denomi<<'\n';
}


fraction fraction::operator-(long dt1,fraction &dt2)
{
return fraction(dt1*dt2.denomi+dt2.numbera,dt2.denomi);
}
void main()
{
fraction a(4,16),b(1,6),c(5),d;
cout<<"初始值:\n";
a.disp();
b.disp();
c.disp();
d.disp();
cout<<"a+b的结果:\n";
c=a+b;
c.disp();
cout<<"a+2的结果:\n";
c=a+6;
c.disp();
d=2+a;
d.disp();

}

编译报错:
F:\C++习题集\practice.cpp(2737) : error C2804: binary 'operator -' has too many parameters
F:\C++习题集\practice.cpp(2804) : error C2677: binary '+' : no global operator defined which takes type 'class fraction' (or there is no acceptable conversion)
执行 cl.exe 时出错.

有个疑问是,为什么不能这样定义fraction fraction::operator-(long dt1,fraction &dt2)
呢,如果不能这样定义,定义成friend fraction operator+(long dt1,fraction &dt2)为什么 又可以了呢?谢谢。。


[解决办法]
http://blog.csdn.net/thefutureisour/article/details/7722076
[解决办法]

二元操作符函数,可以声明为左操作数的成员,这时它应该只有一个参数,用来表示右操作符,而左操作数就是*this。

二元操作符函数,可以声明为非成员函数,这时它应该有两个参数,第一个是左操作数,第二个是右操作数。

如果左操作数是内建类型(比如long),或是没有权力修改的类/结构类型(比如std::ostream),则只能使用非成员形式的操作符函数。
[解决办法]
二目运算符一般重载为友元,你带了两个操作数,重载为成员元不行

热点排行