最近,我正在编写代码并找到以下代码:
CComBSTR userName;
SUCCEED(getUserName(userName));
if(userName == NULL) ...
最后一行警告我,因为我正在将一个对象与NULL
进行比较,这不是直观的。但是在浏览MSDN之后,它得到了完美的支持:
bool operator ==( const CComBSTR& bstrSrc ) const throw( );
bool operator ==( LPCOLESTR pszSrc ) const;
bool operator ==( LPCSTR pszSrc ) const;
bool operator ==( int nNull ) const throw( );
所以我的问题是,为什么CComBSTR
的API设计允许进行这样的比较?只是为了更容忍错误?
答案 0 :(得分:1)
智能指针的设计旨在尽可能模仿原始指针,只需提供自动内存管理,但对外部代码透明。这意味着覆盖->
,=
和&
运算符,实现转换操作等。这样,其余代码可以将智能指针视为真正的指针在几乎所有方面。
想象一下有人开始使用此代码:
BSTR userName;
SUCCEED(getUserName(&userName));
if(userName == NULL) ...
然后想升级到智能指针:
CComBSTR userName;
SUCCEED(getUserName(&userName));
if(userName == NULL) ...
看看它是如何工作的?只有一行改变了。
答案 1 :(得分:0)
首先,您应该找到类CComBSTR的定义,以确认您是否使用Windows系统API而不是您自己的方法。当我们开发COM时,也许您的开发系统重新定义了Class。当我使用Windows的API时,没有问题。祝你好运