我有一个Stack容器类,我想创建各种类型的堆栈的实例.所以我这样做:
template <typename T>
class MyStack
{
.
.
T Pop()
{
if(!IsEmpty())
{
return data[top--];
}
else
{
return NULL; // I got error here
}
.
.
}
Run Code Online (Sandbox Code Playgroud)
当我尝试像这样使用Stack时:
MyStack<GraphNode> blacks;
GraphNode t = blacks.Pop();
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
conversion from ‘int’ to non-scalar type ‘GraphNode’ requested
Run Code Online (Sandbox Code Playgroud)
但是,当我使用指针类型时Stack<GraphNode*>,没有问题.我知道那NULL是0,我理解为什么会出现错误...告诉程序没有更改代码就没有数据返回的优雅方法是什么?我应该向类添加类似隐式类型转换运算符的东西吗?怎么样?
注意:我没有使用STL
通过返回Tby值,函数的契约是您将返回一个值.两种选择是更改函数的合约(例如,返回一个T*)或者通过抛出异常而无法返回.
就个人而言,我认为在这种情况下抛出异常是可以接受和适当的.返回指针,或者说引用覆盖并返回布尔成功值都是不太干净的解决方案.
特别是如果您提供公共IsEmpty()方法,则没有理由选择不太干净的解决方案.不想处理异常的客户端可以利用它IsEmpty来避免接收异常,该异常变成了断言的等价物.
STL std::stack将此功能拆分为top(),返回对最后一个元素的引用,和pop().如果您使用其中任何一个并且堆栈已经为空(即if empty() == true),则该行为是未定义的.这听起来不是一个糟糕的方法.
| 归档时间: |
|
| 查看次数: |
1260 次 |
| 最近记录: |