• 您的位置我爱Aspx >> VC.Net >> 非议MFC(二)逻辑上的不完备
  • 非议MFC(二)逻辑上的不完备

  • 作者:aspxer  来源:internet  日期:2007-5-21 23:49:38  关键字:
  • 这个运算符的正确返回类型应该是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(三)库代码的质量问题》

    我对这篇文章有话说?
  • 广告位招租,广告代号:content_468_15
  • 上一篇:从WEB服务器下载文件的简单方法。
    下一篇:实战DeviceIoControl 之一:通过API访问设备驱动程序
  • 相关文章