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

运算符重载解决办法

2012-03-31 
运算符重载#includeiostreamusing namespace stdclass Complex{Complex(int r 0, int i 0):real(r)

运算符重载
#include<iostream>
using namespace std;
class Complex
{
Complex(int r = 0, int i = 0):real(r), image(i){};
friend ostream& operator << (ostream& output, Complex &p);
friend istream& operator >> (istream& input, Complex &p);
  Complex operator + (Complex &, Complex &);
Complex operator - (Complex &, Complex &);
Complex operator * (Complex &, Complex &);
Complex operator / (Complex &, Complex &);
private:
int real;
int image;
};
ostream& operator << (ostream& output, Complex &p)
{
output<<"["<<p.real<<","<<p.image<<"]"<<endl;
return output;
}
istream& operator >> (istream& input, Complex &p)
{
input>>p.real>>p.image;
return input;
}
Complex Complex::operator +(Complex &p1, Complex &p2)
{
return Complex(p1.real + p2.real, p1.image + p2.image);
}
Complex Complex::operator - (Complex &p1, Complex &p2)
{
return Complex(p1.real - p2.real, p1.image - p2.image);
}
Complex Complex::operator * (Complex &p1, Complex &p2)
{
return Complex (p1.real * p2.real, p1.image * p2.image);
}
Complex Complex::operator / (Complex &p1, Complex &p2)
{
return Complex(p1.real/p2.real, p1.image/p2.image);
}
int main()
{
Complex a(10, 5), b(1, 5), c, d, e, f;
c = a + b;
d = a - b;
e = a * b;
f = a / b;
cout<<c<<endl;
cout<<d<<endl;
cout<<e<<endl;
cout<<f<<endl;
return 0;
}
这个用Visual C++ 6.0 编译出现了问题

[解决办法]
程序中的运算符+-*/的重载函数,其形参只能是一个对象;比如,+运算符重载函数,他的意思是this对象和形参对象相加,返回两个对象之和~
还有,你的程序中的p1.real,表示p1对象访问this对象的real,而不是p1对象访问p1对象的real;所以,这样的访问是非法的~你可以把real设置为protected,也可以再声明一个函数,其功能是返回私有变量real的值~
[解决办法]
上面的real的访问权限设置为public而不是protected~
sorry~
还有,构造函数前面也加上访问权限public吧~
[解决办法]
google一下《exception c++》里面的complex重载,那里有很详细的解释。
[解决办法]
Complex Complex::operator +(Complex &p1, Complex &p2)
{
return Complex(p1.real + p2.real, p1.image + p2.image);
}
Complex Complex::operator - (Complex &p1, Complex &p2)
{
return Complex(p1.real - p2.real, p1.image - p2.image);
}
Complex Complex::operator * (Complex &p1, Complex &p2)
{
return Complex (p1.real * p2.real, p1.image * p2.image);
}
Complex Complex::operator / (Complex &p1, Complex &p2)
{
return Complex(p1.real/p2.real, p1.image/p2.image);
}

不能作为成员函数了,要作为友元函数了


[解决办法]
把运算符也看成一个函数,+-这样的云算符a+b相当于调用a对象的+方法,传入参数为对象b所以形参一个就够了。
前面那个已经通过this指针“悄悄”地穿进去了
[解决办法]

C/C++ code
// etmp.cpp : Defines the entry point for the console application.////编译器 vs2005#include "stdafx.h"#include<iostream>using namespace std;class Complex{public:    Complex(int r = 0, int i = 0):real(r), image(i)    {}    friend ostream& operator << (ostream& output, Complex &p);    friend istream& operator >> (istream& input, Complex &p);    Complex& operator+ (Complex &);    Complex& operator- (Complex &);    Complex& operator* (Complex &);    Complex& operator/ (Complex &);public:    int real;    int image;};Complex& Complex::operator +(Complex &p1){    return Complex(p1.real + this->real, p1.image + this->image);}Complex& Complex::operator - (Complex &p1){    return Complex(this->real - p1.real, this->image - p1.image);}Complex& Complex::operator * (Complex &p1){    return Complex (p1.real * this->real, p1.image * this->image);}Complex& Complex::operator / (Complex &p1){    return Complex(this->real/p1.real, this->image/p1.image);}ostream& operator << (ostream& output, Complex &p){    output<<"["<<p.real<<","<<p.image<<"]"<<endl;    return output;}istream& operator >> (istream& input, Complex &p){    input>>p.real>>p.image;    return input;}int _tmain(int argc, _TCHAR* argv[]){    Complex a(10, 5), b(1, 5), c, d, e, f;    c = a + b;    d = a - b;    e = a * b;    f = a / b;    cout<<c<<endl;    cout<<d<<endl;    cout<<e<<endl;    cout<<f<<endl;    system("PAUSE");    return 0;} 


[解决办法]

探讨

Complex Complex::operator +(Complex &amp;p1, Complex &amp;p2)
{
return Complex(p1.real + p2.real, p1.image + p2.image);
}
Complex Complex::operator - (Complex &amp;p1, Complex &amp;p2)
{
return……

热点排行