【问题标题】:Comparing CComBSTR to NULL将 CComBSTR 与 NULL 进行比较
【发布时间】:2013-05-04 18:21:32
【问题描述】:

最近在写代码,发现如下代码:

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

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

【问题讨论】:

  • BSTR 是指针类型。指针可以为 NULL。
  • @HansPassant 有道理。谢谢!

标签: c++ com smart-pointers bstr


【解决方案1】:

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

想象一下有人从这段代码开始:

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

然后想升级为智能指针:

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

看看它是如何工作的?只改变了一行。

【讨论】:

  • 几天前,有人回复说空的BSTR语义上可以是空指针,“”。我认为那是我错的地方。非常感谢您的帮助!
  • 我根据stackoverflow.com/questions/171641 发布了该答案;但是你的问题是关于NULLCComBSTR,所以我认为这个答案更合适。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多