我编写了一个模板化的容器类,它接受模板参数的类型和模板。
template<class type, template<typename...> class Seq>
class stack1
{
private:
int count;
int size;
Seq<type> st;
//Seq<string> str;
public:
stack1(size_t size):size(100), count(-1){ }
void push(type elem);
type pop();
};
template<class type, template<typename...> class Seq>
type stack1<type, Seq>::pop()
{
if (count < 0)
{
cout << "stack1 is empty," << endl;
/*How to handle this condition.*/
}
else
{
type elem;
elem = st.back();
st.pop_back();
count--;
return elem;
}
}
我的问题是,在pop函数中,当容器对象为空时,我应该如何处理错误场景。我希望在这种情况下返回一些默认值, 例如0 / -1如果容器是int或“”/ null如果它是字符串或0.0如果它是浮点数......就像那样。
答案 0 :(得分:3)
处理它的一种方法是抛出异常。
if (count < 0)
{
throw std::out_of_range("stack1 is empty");
}
我强烈建议不要使用std::cout
在该地点的终端上打印消息。在数据结构的实现中使用std::cout
是一种糟糕的编程习惯。
答案 1 :(得分:3)
@ RSahu的建议是件好事。
另一种方法是改变pop()
函数的签名:
type pop();
到
std::optional<type> pop();
如果堆栈为空则返回std::nullopt
,或者通常情况下包装的值:
if (count < 0) {
return std::nullopt;
}
请注意,std::optional
是在C ++ 17语言标准中引入的;在C ++ 14中,您将其作为std::experimental::optional
,或者您可以将boost::optional
用于C ++ 11及更早版本。
PS:当元素数实际为0时,将count设为-1是个坏主意 - 非常混乱!