返回NULL与返回没有数据的obj
Returning NULL vs returning an obj with no data
这是一个相当普遍的API设计问题,而不是C++相关的问题,无论如何,对于预期返回类实例的函数,通常接受什么:如果出现问题,返回NULL,或者返回该类的无数据实例?
这是我的实际代码:https://github.com/alexandernst/cpp-bitstring/blob/76030321b3a424236c3380067a0dc4f132fb8369/src/Bits.cpp#L360
通常我会返回NULL或throw。失败的代码需要尽早理解。
返回一个"坏掉的"对象的替代方法需要每个函数理解对象坏掉并进行处理
NULL/sthrow要求您为每个构造处理一个错误,如果它失败了
问问自己这个问题:
"我的职能承诺是什么,因此客户的期望是什么?
如果函数承诺返回一个对象,如果不能,则抛出异常。例外情况表示无法履行承诺。
例如:
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);
现在,您强制调用方使用静态访问者来处理您的结果(这很好!它强制调用方覆盖所有代码路径)。
承诺是您将返回一些东西,并且它将是T
或string
,解释为什么没有生成T
。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- 什么时候在C++中返回常量引用是个好主意
- 你能重载对象变量名本身返回的内容吗
- 为什么 Serial.println(<char[]>);返回随机字符?
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 如何获取std::result_of函数的返回类型
- QueryWorkingSet总是返回false
- (C++)分析树以计算返回错误值的简单算术表达式
- 访问者访问变体并返回不同类型时出错
- 如何返回一个类的两个对象相加的结果
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- lower_bound()返回最后一个元素
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何取消对nullptr的屏蔽,返回正确的对象
- 奇怪的结构&GCC&clang(void*返回类型)
- 对象::连接:当 obj 作为shared_ptr返回时没有这样的信号
- 返回NULL与返回没有数据的obj
- 返回c++代码中的Obj-C块
- 如何正确地从c++引擎返回回调到obj-c程序