代码如下:
//Money.h 文件
#ifndef Money_H
#define Money_H
#include<iostream>
#include<fstream>
#include<stdlib.h>
using namespace std;
namespace Moneysavitch
{
class Money
{
public:
Money();
Money(long d);
Money(long d,long c);
friend Money operator +(const Money& m1,const Money& m2);
// friend Money operator -(const Money& m);
friend Money operator -(const Money& m1,const Money& m2);
friend bool operator ==(const Money& m1,const Money& m2);
friend istream& operator >>(Money& m,istream &ins);
friend ostream& operator <<(Money& m,ostream &ous);
void set_value();
private:
long dollars;
long cents;
};
void get_stream(ifstream& ins,ofstream& ous);
}
#endif
//Money类的实现文件:Money.cpp
#ifndef Money_cpp
#define Money_cpp
#include<iostream>
#include<stdlib.h>
#include"Money.h"
#include"Money.cpp"
#define TRUE 1
#define FALSE 0
using namespace std;
namespace Moneysavitch
{
Money::Money():dollars(0),cents(0)
{}
Money::Money(long d)
{
dollars=d;
cents=0;
}
Money::Money(long d,long c)
{
dollars=d;
cents=c;
}
void Money::set_value()
{
cout<<"Enter dollars:/n";
cin>>dollars;
cout<<"Enter cents:/n";
cin>>cents;
}
Money operator +(const Money& m1,const Money& m2)
{
Money temp;
temp.cents=m1.cents+m2.cents;
if(temp.cents>=100)
{
temp.cents=-100;
temp.dollars=m1.dollars+m2.dollars+1;
}
else
{
temp.dollars=m1.dollars+m2.dollars;
}
return temp;
}
Money operator -(const Money& m1,const Money& m2)
{
long temp;
Money m_temp;
if((m1.dollars*100+m1.cents)>=(m2.dollars*100+m2.cents))
{
temp=(m1.dollars*100+m1.cents)+(m2.dollars+100+m2.cents);
m_temp.dollars=temp/100;
m_temp.cents=temp-m_temp.dollars*100;
}
else
{
cout<<"error!The result is negative.";
exit(1);
}
return m_temp;
}
bool operator ==(const Money& m1,const Money& m2)
{
if((m1.dollars==m2.dollars)&&(m2.cents==m2.cents))
return TRUE;
else
return FALSE;
}
istream& operator >>(Money& m,istream &ins)
{
ins>>m.dollars;
ins>>m.cents;
return ins;
}
ostream& operator <<(Money& m,ostream &ous)
{
ous<<"$"<<m.dollars;
ous<<"."<<m.cents<<endl;
return ous;
}
void get_stream(ifstream& ins,ofstream& ous)
{
ins.open("infile.txt");
if(ins.fail())
{
cout<<"Failed to open the output file./n";
exit(1);
}
ous.open("outfile.txt");
if(ous.fail())
{
cout<<"Failed to open the output file./n";
exit(1);
}
}
}
#endif
//入口函数main.cpp
#include"Money.h"
#include"Money.cpp"
#include<iostream>
using namespace std;
using namespace Moneysavitch;
int main()
{
Money m1,sum_m,div_m,m3;
m1.set_value();
Money m2(100,5);
sum_m=m1+m2;
div_m=m1-m2;
fstream ins;
ofstream ous;
get_stream(ins,ous);
ns>>m3;
ous<<m3;
return 0;
}
调试环境vc6.0sp6.调试报错如下:
--------------------Configuration: Money - Win32 Debug--------------------
Compiling...
main.cpp
G:/code/Money/main.cpp(16) : error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class Moneysavitch::Money' (or there is no acceptable conversion)
G:/code/Money/main.cpp(17) : error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class Moneysavitch::Money' (or there is no acceptable conversion)
Error executing cl.exe.
问题解决:
friend istream& operator >>(Money& m,istream &ins);中的形参顺序不对.
修改为friend istream& operator >>(istream &ins,Money& m);即可!
问题扩展:有时导致error C2679: binary '<<错误可能是#inlcude<iostream>和#include<iostream.h>的原因
其实没有< iostream.h >这样的东西 --- 标准化委员会在简化非C标准头文件时用< iostream > 取代了它。
但又没有完全取消< iostream.h >的使用,并且很多编译器都同时支持< iostream >和< iostream.h >,造成
现在的局面.#include < iostream >,得到的是置于名字空间std下的iostream库的元素;如果使用
#include < iostream.h >,得到的是置于全局空间的同样的元素。在全局空间获取元素会导致名字冲突,
而设计名字空间的初衷正是用来避免这种名字冲突的发生.为了避免类名函数名的冲突问题,引入了名字空间std,
但无数现有的C++代码都依赖于使用了多年的伪标准库中的功能,例如,声明在< iostream.h >和< complex.h >等
头文件中的功能。现有软件没有针对使用名字空间而进行相应的设计或者升级,如果用std来包装标准库导致现有
代码不能使用, 程序员是不会同意的。 标准化委员会为了拉拢人心,吸引更多的人入会,决定为包装了std的那部
分标准库构建新的头文件名。将现有C++头文件名中的.h去掉,所以就出现了< iostream.h>和< iostream >等
很多双胞胎。