【发布时间】:2020-03-08 14:55:25
【问题描述】:
我正在尝试编写 Coursera course example of Towers of Hanoi 中给出的 Cube、Stack 示例的实现,以了解更多 C++。
在stack.h我必须实现:
class Stack {
public:
void push_back(const Cube & cube);
Cube removeTop();
Cube & peekTop();
unsigned size() const;
friend std::ostream & operator<<(std::ostream & os, const Stack & stack);
private:
std::vector<Cube> cubes_;
};
我遇到的问题是removeTop()。如果堆栈(向量)为空,我正在考虑返回nullptr,因为pop_back 的行为对于空向量是未定义的。
在空容器上调用 pop_back 是未定义的。 Cpp Reference
inline Cube Stack::removeTop() {
if (!cubes_.empty()) {
Cube top_cube = cubes_.back();
cubes_.pop_back();
return top_cube;
}
else {
return nullptr;
}
}
但是,我在编译过程中遇到错误。
./stack.h:35:12: error: no viable conversion from returned value of type
'std::__1::nullptr_t' to function return type 'uiuc::Cube'
return nullptr;
如果我无法返回nullptr,我该如何保护用户?我是否仅限于告诉用户不应在空堆栈上调用该函数并让他/她负责检查?
【问题讨论】:
-
这是一种选择。另一种选择是使用
std::optional作为返回值。如果您不熟悉如何使用std::optional,您应该在您的 C++ 书籍中找到更多文档。 -
@SamVarshavchik,谢谢。这不是一本书,而是一个视频课程。我会调查
std::optional。还没到。在查看建议之前,我是自己编码的。 -
如果
Cube是指针,或者具有接受指针的构造函数,则返回Cube的函数只能返回nullptr。您的选项包括 (1) 传递对Cube的引用并返回int或bool,用于指示是否可以从堆栈中弹出 (2) 返回std::optional(3) 引发异常如果堆栈为空。选项 (1) 和 (2) 要求调用者进行检查。选项(3)强制调用者(或调用者的调用者)捕获异常(否则程序将终止)。 -
@Peter:你为什么不发表你的评论作为答案?