返回NULL vs返回没有数据的obj

时间:2016-01-02 15:46:17

标签: c++ api

这是一个相当普遍的API设计问题,而不是C ++相关的问题,无论如何,从预期返回类的实例的函数中通常接受的是:如果出现错误则返回NULL或返回该类的实例没有数据?

这是我的实际代码:https://github.com/alexandernst/cpp-bitstring/blob/76030321b3a424236c3380067a0dc4f132fb8369/src/Bits.cpp#L360

2 个答案:

答案 0 :(得分:1)

一般情况下,我会返回NULL或throw。失败的代码需要尽早理解。

返回“损坏”对象的替代方法需要理解对象的每个函数都被破坏并处理它。

NULL / throw要求你为每个构造处理一个错误,如果失败则在你的脸上

答案 1 :(得分:1)

问自己这个问题:

"我的职能的承诺是什么,因此客户的期望是什么?

如果函数承诺返回一个对象,则抛出一个异常,如果它不能。一个例外表示无法履行承诺。

e.g:

T make_t(Arg arg);  // promises to make a T, should throw if it can't

如果函数承诺可能返回一个对象,那么在界面中表达:

boost::optional<T> maybe_make_t(Arg arg);

在这种情况下,如果没有制作对象,我们就不会发生异常,只是空optional<T>。因为我们已经返回了一个可选项,所以调用者必须在使用该值之前检查它(或者遇到异常)。他现在受到保护,免受他自己的逻辑错误。

如果可以避免,请尽量避免返回指针。它们会给您的来电者带来麻烦。

也许(出于某种原因)你想避免异常,但仍能安全地报告失败以保证承诺?

以这种方式:

boost::variant<T, std::string> make_t_or_reason_why_not(Arg arg);

现在你强迫调用者使用静态访问者来处理你的结果(这很好!它迫使他覆盖所有代码路径)。

承诺是返回某些内容, Tstring,解释为什么{{ 1}}没有制作。