我目前有一个方法可以返回一个对象(比如学校)。但是有时在该方法中它可以返回NULL,这是一个int。这种方法的返回类型应该是什么。我可以安全地返回这两种方法中的任何一种。有什么建议 ?我对其他方法持开放态度。
答案 0 :(得分:9)
如果您要返回的类型没有自然的“null”值,boost::optional
似乎就是您要找的。 p>
但是,请考虑是否无法生成返回值是否为错误条件。如果是,而不是返回boost::optional
(或空值),请考虑让函数始终返回预期类型(无论它是什么),并在无法生成返回值时抛出异常。
答案 1 :(得分:7)
如果您有C ++ 11编译器,则应该返回std::unique_ptr<school>
。如果你已经有了C ++ 14的东西,那么std::optional<school>
可能会有效。如果您已安装了boost并且没有std::optional
,则可以考虑boost::optional<school>
。你不应该返回一个原始指针,因为它不清楚,谁负责从功能界面删除指针。
正如Andy所指出的,如果无法成功构造返回值,则可能会抛出异常。这是有道理的,如果案例不经常发生并且调用者通常不希望该函数失败。
答案 2 :(得分:4)
如果要返回NULL
,可以考虑返回学校类型的指针,而不是直接类型。这样,您可以返回NULL,并且能够从调用者确定返回值是否为NULL
。
答案 3 :(得分:1)
考虑一个类学校的静态成员,这是一个无效的学校 - 像......一样......
class School {
public:
static const School invalid;
...
};
您可以返回对无效学校的引用,而不是与null比较,而不是返回null,与School :: invalid进行比较。
可选地,这个无效的学校可以是School的子类,其方法可以做一些可预测的事情 - 比如throw和error - 而不会冒引用空指针的风险。
与任何其他未命名常量一样,null对其值的来源或意图不明确,例如,0x00FFFFFF的信息量比Color :: White少。