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

关于满载加号的一个难题

2013-01-28 
关于重载加号的一个难题本帖最后由 liuhua1982 于 2013-01-11 18:25:35 编辑我定义了一个文本处理的类,重

关于重载加号的一个难题
本帖最后由 liuhua1982 于 2013-01-11 18:25:35 编辑 我定义了一个文本处理的类,重载了它的加号,如下:


TextNode operator+(LPCTSTR sText,const TextNode& text)
{
TextNode text2(sText);
text2.AppendText(text,-1);
return text2;
}

编译的时候有个错误
error C2804: 二进制“operator +”的参数太多
本来之前我的重载是如下定义的:

TextNode operator+(LPCTSTR sText)
{
TextNode text2(*this);
text2.AppendText(sText,-1);
return text2;
}

只有一个参数,编译通过,也工作正确。但是有个缺陷就是:调用的时候类必须在前面。

TextNode tn1,tn2,tn3;
tn1=_T("1111111");
tn2=_T("2222222")+tn1;//error C2678: 二进制“+”: 没有找到接受“const wchar_t [8]”类型的左操作数的运算符(或没有可接受的转换)
tn3=tn1+_T("jjjjjj");//这个就正常


如果说加号只能重载成一个参数的我就不纠结了,可是我参照了CString类的等号重载,如下:

friend CStringT operator+( _In_ const CStringT& str1, _In_ const CStringT& str2 )
{
CStringT strResult( str1.GetManager() );

Concatenate( strResult, str1, str1.GetLength(), str2, str2.GetLength() );

return( strResult );
}

friend CStringT operator+( _In_ const CStringT& str1, _In_ PCXSTR psz2 )
{
CStringT strResult( str1.GetManager() );

Concatenate( strResult, str1, str1.GetLength(), psz2, StringLength( psz2 ) );

return( strResult );
}

那么,我的问题是CString类是如何实现让加号的重载有两个参数呢?

[解决办法]
这就是重载所采用的是友元还是类成员函数的区别了,有的重载必须声明为友元形式,有的都行,你的需求是都行的那种。
那么,我的问题是CString类是如何实现让等号的重载有两个参数呢?
是通过友元的形式实现的。
另外 编译的时候有个错误
error C2804: 二进制“operator +”的参数太多
是因为重载是声明为类成员函数了,所以就省略掉第一个参数,其实就是this指针了。

热点排行