代码之家  ›  专栏  ›  技术社区  ›  bobobobo

C++中用于对象构造的习语

  •  0
  • bobobobo  · 技术社区  · 16 年前

    在很多C++ API中(基于COM的弹簧) 对于您来说,指向所构造对象的指针通常是必需的 **

    你通常会看到这样的签名:

    HRESULT createAnObject( int howbig, Object **objectYouWantMeToInitialize ) ;
    

    除了人们想看到错误代码,这是什么原因?用这个更好吗 **

    wchar_t* getUnicode( const char* src ) ;
    

    或者最好写为:

    void getUnicode( const char* src, wchar_t** dst ) ;
    

    出于某种原因,这种方式往往会提醒我,我也必须取消分配它。

    7 回复  |  直到 16 年前
        1
  •  11
  •   Stack Overflow is garbage    16 年前

    “除了想要错误代码”?

    你怎么会这么想 a另外。错误代码几乎是唯一的原因。函数需要某种方法来指示失败。C没有异常,因此它必须通过指针参数或返回值来实现,并且返回值是惯用的,在调用函数时更容易检查。

    (顺便说一句,没有普遍的规则 **

        2
  •  2
  •   haffax    16 年前

    我想到两个原因。

    首先是错误代码。除了C++之外,C没有例外,COM是C-API。此外,许多基于C++的项目出于各种原因不喜欢使用异常。

    其次,函数只能有一个返回值,但调用它们可能会创建多个对象。如果使用非空指针调用这些函数,则某些Win32 API函数将多个指向指针的指针视情况填充。如果返回值是包含多个指针的structby值,则不能返回两个指针,或者更确切地说,这将很难使用。在这里,一致的API也是一个明智的目标。

        3
  •  1
  •   Svisstack    16 年前

    传递的函数参数中的新对象 ** void bool 例如,返回函数的成功或提供函数工作的其他信息。

    对于产生的错误代码,这是更好的 .

        4
  •  1
  •   utnapistim    16 年前

    除了人们想看到错误代码,这是什么原因?

    这是有原因的。其中之一是编写一个在C中可用的接口(您可以在WinAPI和windowscom中看到这一点)。

    retval Myfunction(Result *& output);
    

    retval Myfunction(Result ** output);
    

    或者(更好):

    Result *Myfunction();
    

        5
  •  0
  •   Jeremy Friesner    16 年前

    我不确定我是否同意这是最好的方法。。。这样可能更好:

    Object * createAnObject(int howbig, HRESULT * optPlaceResultCodeHereIfNotNull = NULL);
    

    这样就不必纠结于双重间接寻址(对于不习惯它的人来说,这可能有点棘手),而不关心结果代码的人根本不必担心第二个参数。。。他们可以检查返回值是否为NULL。

    Object * createAnObject(int howbig);
    Object * createAnObject(int howbig, HRESULT & returnResultCode);
    
        6
  •  0
  •   Igor Zevaka    16 年前

    COM调用中的任何方法调用 必须是

        7
  •  0
  •   Syd    16 年前

    没有回答你的问题,而是一个评论,因为你的问题带来了一些我对COM/DCOM编程使用C++的想法。

    所有这些“指针”和“指针指针”、内存管理和引用计数是我不敢用C++进行COM编程的原因。即使有ATL,我也不喜欢它,原因很简单,它看起来不够自然。说到这里,我确实用ATL做了一些项目。

    今天,我会用C。

    推荐文章