2013-05-10 75 views
0

最近,我工作的一个代码,发现下面的代码:比较的CComBSTR为NULL

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(); 

所以我的问题是,为什么会API的CComBSTR设计允许这样的比较?只是为了更容忍错误?

+1

BSTR是一个指针类型。指针可以是NULL。 – 2013-05-10 07:29:51

+0

@HansPassant有道理。谢谢! – Archer 2013-05-13 02:58:05

回答

1

智能指针的设计目的是尽可能地模仿原始指针,只需提供自动内存管理,但对外部代码却是透明的。这意味着覆盖->,=&运算符,实现转换操作等。这样,其余代码可以将智能指针视为几乎所有方面的实际指针。

想象有人开始使用此代码:

BSTR userName; 
SUCCEED(getUserName(&userName)); 
if(userName == NULL) ... 

然后想升级到智能指针:

CComBSTR userName; 
SUCCEED(getUserName(&userName)); 
if(userName == NULL) ... 

见是如何工作的?只有一条线改变了。

+0

几天前,有人回应说空的BSTR在语义上可以是空指针,“”。我认为那是我犯错的地方。非常感谢您的帮助! – Archer 2013-05-13 02:59:30

+0

我发布了基于http://stackoverflow.com/questions/171641/的答案;但你的问题在于'CComBSTR'上的'NULL'检查,所以我认为这个答案更合适。 – 2013-05-13 06:45:02

0

首先,您应该找到类CComBSTR的定义来确认您是否使用Windows系统API而不是您自己的方法。当我们开发COM时,也许你的开发系统重新定义了Class。当我使用Windows的API时,没有问题。祝你好运