Сравнение 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 разрешить такое сравнение? Просто чтобы быть более терпимым к ошибкам?

0

Решение

Интеллектуальный указатель спроектирован и предназначен для максимального имитации необработанного указателя, просто обеспечивает автоматическое управление памятью, но в остальном он прозрачен для внешнего кода. Это означает переопределение ->, =, а также & операторы, реализующие операции преобразования и т. д. Таким образом, остальная часть кода может обрабатывать умный указатель, как если бы он был реальным указателем почти во всех аспектах.

Представьте, что кто-то начал с этого кода:

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

Затем захотел обновить до умного указателя:

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

Видишь, как это работает? Только одна строка изменилась.

1

Другие решения

Сначала вы должны найти определение класса CComBSTR, чтобы подтвердить, используете ли вы системный API Windows, а не свой собственный метод. Когда мы разрабатываем COM, возможно, ваша система разработки переопределяет класс. когда я использую API окон, проблем нет. удачи

0