注册 登录
编程论坛 C++教室

一个小问题,谁帮我解决一下!!!!!

qianzhangxin 发布于 2010-06-06 21:37, 692 次点击
#include<iostream.h>
class Complex
{
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;}
    Complex(double r,double i){real=r;imag=i;}
    friend Complex operator + (Complex &,Complex &);
    void display();
private:
    double real;
    double imag;
};
Complex operator + (Complex &c1,Complex &c2)
{return Complex(c1.real+c2.real,c1.imag+c2.imag);}
void Complex::display()
{cout<<"("<<real<<","<<imag<<"i)"<<endl;}

int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    c2=c1+2.5;
    c3.display();
    return 0;
}






error C2679: binary '+' : no operator defined which takes a right-hand operand of type 'const double' (or there is no acceptable conversion)
执行 cl.exe 时出错.

shixi.obj - 1 error(s), 0 warning(s)
10 回复
#2
孔凡龙king2010-06-06 22:41
c2=c1+2.5;错误
运算符+重载函数friend Complex operator + (Complex &,Complex &);
操作对象为两个Complex实例
#3
kingsroot2010-06-06 22:43
#include<iostream>
using namespace std;
class Complex
{
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;}
    Complex(double r,double i){real=r;imag=i;}
    friend Complex operator + (Complex &,Complex &);
    friend Complex operator + (Complex &,double );
    void display();
private:
    double real;
    double imag;
};
Complex operator + (Complex &c1,Complex &c2)
{return Complex(c1.real+c2.real,c1.imag+c2.imag);}
Complex operator + (Complex &c1,double c2)
{return Complex(c1.real+c2,c1.imag + 0.0);}
void Complex::display()
{cout<<"("<<real<<","<<imag<<"i)"<<endl;}

int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    c2=c1 + 2.5;//你这个是常数,+好没有办法运算这个,你要重载一个+函数
    c3.display();
    return 0;
}
#4
qianzhangxin2010-06-07 12:06
回复 3楼 kingsroot
但是我在类中定义了一个转换构造函数,实数和复数进行运算的时候就能够将实数转换成复数的啊。
#5
qianzhangxin2010-06-07 12:18
按照谭浩强的习题编的程序,vs2008编译有误:
Complex(double r,double i)
 {
  real=r;
  imag=i;
 }
按照谭老爷子的讲解,主函数里的c3=c1+2.5这一行,应该这样理解,首先调用重载运算符函数,计算c1+2.5,这时候又发现,2.5不是Complex类的,这时系统寻找类型转换函数,找到了,就应该调用类型转换函数,将2.5强制转换成Complex类的,完事了,在继续调用对+的重载函数。可是我运行的时候,VS2008说,+号两边的变量类型不对,应该是没把2.5转换成Complex类对象。为什么呢?期待高手为小弟解惑,先行谢过……
问题补充:程序没发全,不好意思:

#include <iostream.h>
class Complex
{
public:
 Complex()
 {
  real=0;
  imag=0;
 }
 
 Complex(double r)
 {
  real=r;
  imag=0;
 }
 Complex(double r,double i)
 {
  real=r;
  imag=i;
 }
 void display()
 {
  cout<<"("<<real<<","<<imag<<")"<<endl;
 }
 friend Complex operator+(Complex&,Complex&);
private:
 double real,imag;
};


int _tmain(int argc, _TCHAR* argv[])
{
 Complex c1(2,3),c2(4,5),c3;
 double d=2.5;
 //c2=d;
 c3=c1+2.5;
 c3.display();
 system("pause");
 return 0;
}
Complex operator+(Complex &c1,Complex &c2)
{
 return Complex(c1.real+c2.real,c1.imag+c2.imag);


#6
kingsroot2010-06-07 12:26
#include<iostream>
using namespace std;

class Complex
{
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;}
    Complex(double r,double i){real=r;imag=i;}
    friend Complex operator + (Complex &,Complex *);
    void display();
private:
    double real;
    double imag;
};
Complex operator + (Complex &c1,Complex *c2)
{return Complex(c1.real+c2->real,c1.imag+c2->imag);}
void Complex::display()
{cout<<"("<<real<<","<<imag<<"i)"<<endl;}

int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    c2=c1+(&(Complex(2.5)));//要把这里显示调用转换函数,然后传地址,因为这里引用没有作用(具体涉及到编译器实现了)
    c2.display();
    return 0;
}
这样就对了 但是不建议这样子做
#7
qianzhangxin2010-06-07 13:00
回复 6楼 kingsroot
那还有没有其他的方法啊,不要实数复数相加用运算符重载。
#8
kingsroot2010-06-07 13:38
那就用我Complex operator + (Complex &c1,double c2)实现一个友员函数就可以了呀
#9
qianzhangxin2010-06-07 14:29
回复 8楼 kingsroot
那你用的是什么编译器啊?? 是VC++ 吗?????

#10
kingsroot2010-06-07 23:25
G++ 和标准C++兼容得很号  VC++编译器不是很好
#11
南国利剑2010-06-08 13:28
回复 楼主 qianzhangxin
这个主要技术就是重载运算符+
这个重载函数的返回值最好设为引用。
其他的没有什么了。
1