我有一个类的形式
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 *不是一种选择。
谢谢!
通常,您可以使用std::optional
(std::experimental::optional
,如果不是C ++ 17)来解决这个问题,以表明c
可能有也可能没有孩子。请注意,如果你返回一个T*
只需返回nullptr
就行了。两者都需要更改功能签名,您已经说过这是不允许的。
这真的只剩下两个选择:
throw
和exception
T
,as @elinx highlights in the comments从you've stated that it's undefined to not have a child开始你应该抛出异常。在调用getChild
之前,有责任确保对象有一个孩子。如果您只是返回一个T()
,来电者可能没有意识到没有孩子。