从C ++方法返回未定义的值

时间:2018-03-01 02:35:42

标签: c++ templates undefined

我有一个类

的类
template <typename T>
class c {

    bool hasChild = *something*;
    T *child;

public:

    T getChild() {
        if(hasChild) {
           return *child;
        } else {
           return 0; // <<-- this line
        }

}

我的实际课程非常不同,但这代表了我更简单的具体问题。当hasChild为false时,getChild将返回未定义的值。但是由于c ++没有像Java和其他语言那样的NULL值,我不确定我能返回什么,因为我没有其他类型为T的对象的引用,因为它是一个模板而无法构造一个。根据API的要求,方法method必须返回类型为T的对象,因此更改方法签名以返回其他堆栈溢出帖子上建议的T *不是一种选择。

谢谢!

2 个答案:

答案 0 :(得分:5)

通常情况下,您可以使用std::optionalstd::experimental::optional,如果不是C ++ 17)来解决此问题,以表明c可能有也可能没有孩子。请注意,如果您返回T*,只需返回nullptr即可。两者都需要更改功能签名,您已经说过这是不允许的。

这实际上只剩下两个选项:

    如果找不到孩子,则
  1. throw exception
  2. 返回新构建的Tas @elinx highlights in the comments
  3. 因为you've stated that it's undefined to not have a child你应该抛出异常。在调用getChild之前,有责任确保对象有一个孩子。如果您只是返回T(),则来电者可能没有意识到没有孩子。

答案 1 :(得分:0)

请记住,有一个空对象概念-它返回适合定义的接口的实例,并始终返回有效的对象。 可以针对object.isNull()对其进行测试,或者什么都不做(更好)。

当必须返回引用时,这很常见。(根据bob叔叔:不要返回null,也不要返回任何需要检查的内容以作进一步使用。异常也是必须返回的一种返回已选中。)