C++运算符重载做友元函数的综合问题
这是一个运算符重载的程序,但是运行时候(VC++6.0下),老是出现这样的错误:
error C2679: binary '+' : no operator defined which takes a right-hand operand of type 'const int' (or there is no acceptable convers
下面是源程序:
#include <iostream.h>
class Complex
{
public:
Complex(){real=0;image=0;}
Complex(double ,double );
Complex operator+(int &);
friend Complex operator +(Complex &,Complex &);
void display();
private:
double real;
double image;
};
Complex::Complex(double a,double b)
{
real=a;
image=b;
}
Complex Complex::operator +(int &a)
{
return Complex(this->real+a,this->image);
}
Complex operator+(Complex &b,Complex &a)
{
return Complex(b.real+a.real,b.image+a.image);
}
void Complex::display()
{
cout<<real<<"+"<<image<<"i"<<endl;
}
int
main(void)
{
Complex a(1,2),b(2,1),c;
c=b+2;
a.display();
b.display();
c.display();
return 0;
}
这是全部的程序,还请高手指点一二!
伪代码描述一下c=b+2,相当于调用c.operator =(int &a = 2);
也就是说你那样声明定义错晌州派误就是和int &ref = 2010;这样的宴贺错误一样。
把Complex operator+(int &);改为Complex operator+(int);定义处也随着改就可以了。
或者调用时候这样写:
int m = 2; //避免直接引用到数字上
Complex a(1,2),b(2,1),c;
c=b+m;
不明白直接迹誉Hi。
改成如下:
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(){real=image=0;}
Complex(double a ,double b ):real(a),image(b){};
//上面毕消衫只是写法简化了一下,与源程序没有分别
Complex(double a):real(a),image(0){};
//多加了一个构造函数,注意其参数,这个构造函数可以把单独一个数比如整数
//构造成一个复数。很有用哦。
//可以实现类似 complex+n的运算.
friend Complex operator +(Complex ,Complex );//不用传地址了,传值就OK
void display();
private:
double real;
double image;
};
Complex operator+(Complex b,Complex a)
{
return Complex(b.real+a.real,b.image+a.image);
}
void Complex::display()
{
cout<<real<<"+"<<image<<"手腔i"<<endl;
}
main(void)
{
Complex a(1,2),b(2,1),c;
c=b+2;//在这里桥谈,编译器会调用 +(complex b,complex(2))来进行运算
//甚至可以加一个c=2+2,都会正确运算出复数来的哦.
a.display();
b.display();
c.display();
return 0;
}
//OK,解决了.
GCC++4.4 &&BCC++5.5均编译通过并正确运行
操作符重载是要左瞎脊操作数碰神逗,也就是说Complex Complex::operator +(int &a)
的声明是不对笑卖的,应该这样声明:Complex Complex::operator +(complex&cl1,int &a)。操作符重载和成员函数的使用还是有所差别的。