我有一个如下所示的create方法,其中我想(如果返回是一个空指针)从中获取错误。但是我希望这个错误处理是可选的,而不是调用函数的要求。
代码:
class foo {
foo() {...};
public:
~foo();
static foo* createFoo(int aparam = 42, int bparam = 10, int& error = ?) {
afoo* = new foo();
if (!afoo) {
error = 11;
return 0; //NULL
}
...
return afoo;
}
}
所以我可以决定使用:
foo* myfoo = createFoo(42);
if (!myfoo) { ... }
或者
int errorcode = 0;
foo* myfoo = createFoo(42, 10, errorcode);
...
此时(在我的实际代码中),我只是使用空指针(而不是ref)并在给出错误之前在createFoo代码中确定其有效性。
我对这种情况的最佳做法感兴趣。
答案 0 :(得分:1)
当您通过引用传递某些内容时,您告诉该函数的用户这是必需参数。如果要使错误代码可选,请传入指向int的指针并将其默认值设置为null。
static foo* createFoo(int aparam = 42, int bparam = 10, int* error = NULL)
答案 1 :(得分:1)
我不知道我可以提供最佳实践,但这是我的观点。
检查NULL(失败的分配)是C和C ++中的标准做法,它是一个易于理解且易于识别的习惯用法。添加可选的错误代码,同时提供灵活性也增加了可能不需要的复杂性。它会使调用者负担决定是否使用该参数。
为什么他们会使用参数,除非他们认为该位置可能失败?怎么会
如果您认为错误代码很重要。我会建议备用签名,你总是检查返回码,不要检查返回指针的值:
// Returns error code.
static int createFoo(int, int, Foo **);
这可能是一个不太方便的功能,但会向正确的方向轻推调用者(用户)。
或者,您可以使用异常,既可以确保抛出std :: bad_alloc,也可以使用相应的错误代码抛出您自己创建的异常。这似乎是最干净的签名:
struct fooException { int error; }
// Throws fooException if cannot create foo.
static foo * createFoo(int, int);
我所追求的理念是:尽量减少复杂性。在这种情况下,删除似乎是一个无关的选项。 错误代码是重要的,应该始终,或者它是无关紧要的,并且将始终被忽略。