0

最近、私はコードに取り組んでいて、次のコードを見つけました:

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このような比較が可能になるのはなぜですか? エラーにもっと寛容になるためですか?

4

2 に答える 2

1

スマート ポインターは、可能な限り生のポインターを模倣するように設計および意図されており、単純に自動メモリ管理を提供しますが、それ以外の場合は外部コードに対して透過的です。つまり、->=、および&演算子をオーバーライドし、変換操作を実装するなどです。このようにして、コードの残りの部分は、スマート ポインターをほぼすべての面で実際のポインターであるかのように扱うことができます。

誰かがこのコードから始めたと想像してください:

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

次に、スマート ポインターにアップグレードしたいと考えました。

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

それがどのように機能するか見てください。1行だけ変更。

于 2013-05-10T08:18:19.527 に答える
0

まず、クラス CComBSTR の定義を見つけて、独自のメソッドではなく Windows システム API を使用しているかどうかを確認する必要があります。COM を開発するとき、開発システムがクラスを再定義することがあります。Windows の API を使用する場合は問題ありません。幸運を

于 2013-05-10T07:11:19.897 に答える