题
在很多C ++ API'S的(基于COM的那些弹簧记)那请强>东西给你,指针被构造通常需要作为**
指针的对象(和功能将构建和INIT为你)
您通常看到签名这样的:
HRESULT createAnObject( int howbig, Object **objectYouWantMeToInitialize ) ;
- 但你很少看到新的对象被传递作为返回值
除了人们希望看到错误代码,究竟是什么原因呢?是最好使用**
图案,而不是简单的操作,如一个返回指针:
wchar_t* getUnicode( const char* src ) ;
或者将这个更好被写为:
void getUnicode( const char* src, wchar_t** dst ) ;
我能想到的最重要的是要记住释放它,和**
方式,出于某种原因,往往会提醒我,我必须释放它为好。
解决方案
“除了想要的错误代码”?
是什么让你觉得有为的一个之外。错误代码是几乎是唯一的原因。该函数需要一些方法来表示失败。 C没有异常,因此它有这样做通过任一个指针参数,或返回值,并且返回值是惯用的,和容易检查在调用函数时。
(顺便说一下,有这么**
意味着你必须释放对象没有通用的规则,这是情况并非总是如此,这可能是一个糟糕的主意,用的东西,任意提醒你哪些对象进行清理。)
其他提示
理由二来我的心。
首先是错误代码实际上。 C以外++,C没有异常,COM是一个C API。也有许多基于C ++的项目不喜欢使用各种原因的异常。 可能有情况下,如果返回值不能信号误差,例如如果你的函数返回一个整数,可能没有整数值,可以代表一个错误代码。虽然信令具有指针的错误时容易(NULL ==错误),一些API设计者喜欢信号误差超过所有功能一致的方式。
其次,函数只能有一个返回值,但称他们可以创建多个对象。一些Win32 API函数需要多个指针的指针,可以选择性地填补,如果调用非NULL指针这些功能。你不能返回两个指针,或者更确切地说,这将是很难使用,如果返回值是一些结构含有一个以上的指针值。这里也是一致的API是一个明智的目标来实现的。
新在由**
传递函数的参数对象是更好。这需要我的安慰未来利用变化void
来bool
例如函数或其他信息提供功能的作品回报成功。
答案在一个行:。的这是导致错误代码强>好得多
除了人们希望看到错误代码,究竟是什么原因呢?
有一些原因。其中之一是写一个接口,用C可用(你看到这在WinAPI的和Windows COM)。
向后兼容性的另一个原因(即,接口写像现在打破它会破坏现有的代码)。
我与C兼容性使用这样的代码时去一个设计原则。如果你用C写++你会写
retval Myfunction(Result *& output);
,而不是
retval Myfunction(Result ** output);
或(更好):
Result *Myfunction();
和具有功能扔在错误的异常。
我不知道我同意这是做到这一点的最好方式......这可能是更好的:
Object * createAnObject(int howbig, HRESULT * optPlaceResultCodeHereIfNotNull = NULL);
这样,没有关于用双间接梅辛(它可以是一个有点棘手谁是不使用它的人),谁不关心结果代码的人不担心关于在所有的第二个参数......他们可以检查,看看如果返回值为NULL或不是。
事实上,因为它是C ++,你可以让事情变得更容易的是,使用函数重载:
Object * createAnObject(int howbig);
Object * createAnObject(int howbig, HRESULT & returnResultCode);
在COM呼叫的任何方法调用的必须是强> HRESULT。返回代码得到利用遍布框架并通过一个双指针是公知的方法来获得所创建的对象。
不回答你的问题,但评论你的问题带出了一些想法我对COM / DCOM使用C ++编程。
所有这些“指针”和“指针的指针”,存储器管理和引用计数是为什么我从做COM编程用C ++回避的原因。即使采取了ATL,我不喜欢它的原因很简单,它看起来不自然不够。话虽如此,我没有用ATL做的几个项目。
回到然后另一种方法是使用VB。 VB代码看起来更自然的COM或DCOM的程序。
今天,我会使用C#。