因为标题声明我有这个问题。我正在实现一个双向链接列表作为模板和一些功能,如
Element getFirst();
Element getLast();
Element getPosition(int position);
它们应该返回Element类型的元素。问题是,如果列表为空怎么办?那我该怎么回事?我不能返回0或一些整数,因为如果我的元素是一个结构。它将在稍后的代码中崩溃。那么我的回报应该是什么? 我尝试创建一个Element类型的空变量并发送它,但这也不起作用。 有什么想法吗?
我可以提供您需要的任何代码或信息。请问
答案 0 :(得分:5)
解决方案取决于您:
empty
方法检查对函数的调用是否有效。这是std::vector::front
的情况。std::vector::at
之类的异常。boost::optional
T
的默认构造对象,理想情况下可以检查它是否无效。与QHash::value
的内容类似。在任何一种情况下,您都必须在代码中的某处进行检查。
答案 1 :(得分:2)
使用boost::optional
。您可以将返回类型更改为boost::optional<Element>
。 boost::optional
是contextually convertible to bool
。因此,一个示例用法是:
if(yourList.getFirst())
std::cout << "Found the first element." << std::endl;
else
std::cout << "No first element exists." << std::endl;
在幕后,boost::optional<T>
维护一个bool
,指示对象是否已使用有效的T
初始化。默认构造函数创建一个标记为没有有效optional<T>
的{{1}}对象。
答案 2 :(得分:2)
有几种选择:
提供查询方法以查看对象是否支持op(例如empty
)。
返回可能表示“空”的内容。例如,您可以返回(const)指针,或optional<Element>
。
一种可行但应该避免的不同方法是抛出异常。