我爱Aspx >> VC.Net >> 非议MFC(二)逻辑上的不完备这个运算符的正确返回类型应该是CRect &。
难道MFC的开发人员不看《Effective C++》?
4.数学运算的对称破缺
<WINDEF.H>
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT, *PPOINT, NEAR *NPPOINT, FAR *LPPOINT;
<AFXWIN.H>
class CPoint : public tagPOINT
{
CPoint operator+(POINT point) const;
};
给出如下测试代码:
POINT pt;
CPoint pnt;
CPoint result;
result=pnt+pnt;
result=pt+pt;
result=pnt+pt;
result=pt+pnt;
pnt+pnt自然没问题,pt+pt报错也勉强可以理解,但是pnt+pt可以,pt+pnt偏偏就不行。直觉上,加法应该满足交换率,但是MFC“一鸣惊人”地打破了我们的思维惯性。
实际上,如果把运算符函数声明为:
friend const CPoint operator+(const POINT & pntL,const POINT & pntR);
前述的四个语句就都可以通过了。
也许有人会说:“friend关键字是非面向对象的,最好不要使用。”那么,我要说:首先,C++不是Java,它的主要设计原则是满足大型系统的效率、弹性和可维护性,面向对象中好的方法要采纳,非面向对象中好的方法也要采纳。其次,MFC在其他地方就使用了friend。
如果认为pnt和pt之间不允许相加,那也应该把运算符函数声明为更安全的形式:
const CPoint operator+(const CPoint & pntR) const;
这样就只允许pnt和pnt相加了。
要行都行,要不行都不行,不要歧视!
请参考下一篇《非议MFC(三)库代码的质量问题》
【我对这篇文章有话说?】
实战DeviceIoControl 之一:通过..[05-21]
Windows中文输入法的实现[05-21]
用Delphi 6开发ASP上传组件详解[05-21]
”新快乐时光“再解[05-21]
Notes中有关C++API的注意事项[05-21]
Domino SMTP设置[05-21]
游戏修改器[05-21]
windows API简介--用户接口(系列..[05-21]
一个应用二叉搜索树实现的字典,..[05-21]
一个逻辑推理类--从规则推测前提..[05-21]