В последнее время я работал над кодом и нашел следующий код:
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
разрешить такое сравнение? Просто чтобы быть более терпимым к ошибкам?
Интеллектуальный указатель спроектирован и предназначен для максимального имитации необработанного указателя, просто обеспечивает автоматическое управление памятью, но в остальном он прозрачен для внешнего кода. Это означает переопределение ->
, =
, а также &
операторы, реализующие операции преобразования и т. д. Таким образом, остальная часть кода может обрабатывать умный указатель, как если бы он был реальным указателем почти во всех аспектах.
Представьте, что кто-то начал с этого кода:
BSTR userName;
SUCCEED(getUserName(&userName));
if(userName == NULL) ...
Затем захотел обновить до умного указателя:
CComBSTR userName;
SUCCEED(getUserName(&userName));
if(userName == NULL) ...
Видишь, как это работает? Только одна строка изменилась.
Сначала вы должны найти определение класса CComBSTR, чтобы подтвердить, используете ли вы системный API Windows, а не свой собственный метод. Когда мы разрабатываем COM, возможно, ваша система разработки переопределяет класс. когда я использую API окон, проблем нет. удачи