所以我有以下方法:
template <class DT> //needs testing
DT& LinkedSortedArrays<DT>::find (const DT& key)
{
list<SortedArray<DT>>::iterator it = SAList.begin();
for( ; it != SAList.end(); ++it){
try{
if (it == SAList.begin() && key < (*it)[0]) throw Exception();
return (*it).find(const_cast<DT&> (key));
} catch (ArrayException e) {
}
}
throw Exception();
}
我之前已定义过课程Exception
和ArrayException
。每次在正在搜索的特定Array类中找不到(*it).find(const_cast<DT&> (key))
时,key
将抛出一个ArrayException。 SAList
是STL List
。代码编译得很好。但是我没有在我的程序中尝试过。为什么?我需要有人在我做的以下假设中确认或纠正我:
if (it == SAList.begin() && key < (*it)[0]) throw Exception();
抛出异常时,就意味着它会将它抛出for循环,甚至在方法之外,对吗?throw Exception();
会在方法之外抛出异常。++it
扭曲了我的大脑。帮助can't convert const int to int&
(因为find()
中的(*it).find(const_cast<DT&> (key))
不属于LinkedSortedArrays
,而是需要DT&amp;变量的另一个LinkedSortedArrays
并且find()
的{{1}}具有const DT&amp;类型的参数,我发现可能的解决方案可能是将其写为const_cast<DT&> (key)
。我需要就此发表第二意见。最后,我理解这是不是一个特定的问题,因此我得到了投票和/或问题被关闭。我根本不知道还有什么要问的。 如果我是在错误的地方询问的话。道歉。
答案 0 :(得分:2)
是的,它会上升到堆栈,直到找到合适的catch
处理程序。如果找不到这样的处理程序,程序将终止。
是的。
不,它不会,因为end
应该将迭代器返回到结尾的一个,而不是最后一个元素。除非该容器的设计也很糟糕,否则您必须查阅文档以确定。
这是一个糟糕的设计,find
应该通过const
引用来获取其参数。既然你做不到,你将不得不制作副本,除非你想冒未定义的行为风险:
DT nonconstkey = key;
return it->find(nonconstkey);