我可以避免返回函数的模板返回类型吗?

时间:2013-05-03 05:31:56

标签: c++

我正在构建优先级que,并尝试将其设为模板类。当我弹出时,它必须返回类型T.有没有办法返回任何东西或一个好的做法,以避免在崩溃中没有任何东西崩溃?

3 个答案:

答案 0 :(得分:4)

此处的预期行为是抛出异常。在尝试弹出之前,用户应检查队列是否为空。您也可以返回null,但前提是您的类型T的值永远不会为null,否则如果因为发生错误或者队列中的下一个值为null而返回它是不明确的。

答案 1 :(得分:1)

模板与问题无关。

有几种常见的方法来处理这种情况:

  1. 将对象存储在堆上。删除后,从数据结构中分离对象并返回对它的引用(指针)而不是对象本身。如果数据结构为空,则返回NULL。
  2. 仅当队列不为空时才将pop定义为有效。因此,用户需要在调用pop(需要提供isEmpty功能)之前执行空白检查。如果不满足此前提条件,则异常/错误返回是有效的处理。

答案 2 :(得分:0)

一般来说,pop操作应该not返回一个值。那是因为返回类型的拷贝构造函数可能抛出异常;如果发生这种情况,该值将从队列中消失,并且未在任何地方复制,因此它已经消失了。

相反,应该有两个操作:一个top函数返回对数据结构顶部对象的引用,一个pop函数删除顶部元素但不什么都归还如果您查看std::queue,您会看到成员void pop()reference front(),它们会返回对顶部元素的引用。

现在回答你的问题。 <g>弹出空队列是一个错误。在标准库中,它会产生未定义的行为。如果要添加用于错误检查的代码,则应该抛出异常或中止程序。我倾向于后者;如果调用代码尚未确定存在要弹出的元素,则可能尚未编写以强制处理异常。另一方面,在GUI中,可能抛出终止当前操作的异常;这将使应用程序继续运行并等待下一个用户请求。