2013-05-10 76 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時,沒有問題。祝你好運