c++运算符重载单的问题
如下的一个函数有什么问题吗?
ostream& operator << (ostream& out,const T& a) { out<<a.m_nNumber; return out;}
问题点数:0、回复次数:8Top
1 楼dot99(又来混CSDN来了)回复于 2003-11-04 18:48:00 得分 0
如果a.m_nNumber是public,就没问题~
如果是重载template的<<,那最好在template里面重栽Top
2 楼loyalzu(Pointer)回复于 2003-11-04 18:54:14 得分 0
不是的T是我定义的一个类名
class T
{
public:
int Get() const { return m_nNumber;}
void Set(int nNewVal) { m_nNumber = nNewVal;}
T& operator =(const T& x) { m_nNumber = x.m_nNumber;return *this;}
ostream& operator << (ostream& out,const T& a) { out<<a.m_nNumber; return out;}
T(int m) { m_nNumber = m;}
protected:
int m_nNumber;
};
谢谢了Top
3 楼loyalzu(Pointer)回复于 2003-11-04 18:56:08 得分 0
C:\er.cpp(10) : error C2804: binary 'operator <<' has too many parameters
是这个问题,不知道是什么原因
Top
4 楼tuxw(醉书生)回复于 2003-11-04 19:01:22 得分 0
m_nNumber是保护的,最好将<<重载为友员函数Top
5 楼plainsong(短歌)()回复于 2003-11-04 19:02:26 得分 0
cout << a;
要重载operator <<只能有两种方法,一是做为ostream的成员(因为第一个参数是ostream),一是做为全局操作符。
做为成员已经不可能,因为你不能改写ostream;全局实现也有问题:当你需要访问T的非公开成员时。
很多人都用友元解决,不过更好的方法是:
class T
{
...
public:
ostream& output(ostream& ostrm)
{
return ostrm << m_nNumber;
}
...
};
ostream& operator << (ostream& out,const T& a) { return a.output(out);}
Top
6 楼plainsong(短歌)()回复于 2003-11-04 19:05:10 得分 0
原来如此。
把operator <<定义为全局的就行了。
二元操作符重载时有两种形式:
1:定义为左操作数类型的成员,参数只有一个,类型为右操作数
2:定义为全局操作符,参数有两个,第一个类型是左操作数,第二个类型是右操作数。Top
7 楼dot99(又来混CSDN来了)回复于 2003-11-04 20:40:21 得分 0
转过来一看,楼上就回答完了~~~
plainsong(短歌)是对的~Top
8 楼rushinger(阮祥哥)回复于 2003-11-04 20:40:26 得分 0
兰大的。Top




