2012-10-23 64 views
0

所以我有以下方法:與嘗試捕捉和異常方法拋出

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(); 
} 

我以前定義的類ExceptionArrayException(*it).find(const_cast<DT&> (key))每次在當前正在搜索的特定Array類中找不到key會拋出ArrayException。 SAList是一個STL List。代碼編譯得很好。但是我沒有在我的程序中嘗試過。爲什麼?我需要有人來證實或糾正我以下假設我這樣做:

  1. 每當if (it == SAList.begin() && key < (*it)[0]) throw Exception();拋出一個異常,這意味着它將把它外面的for循環,甚至外面的方法,對嗎?
  2. 我幾乎可以肯定,最後一行throw Exception();將在方法外拋出異常。
  3. for循環的排列方式,它不會跳過SAList的第一個元素,對吧?我的意思是,我已經在整個互聯網上看到了這個特定的代碼,它用來遍歷列表中的所有元素,就好像它是標準的或完美無缺的,但是...... ++it正在扭曲我的大腦。幫幫我?
  4. 我被接收的can't convert const int to int&錯誤(由於(*it).find(const_cast<DT&> (key))find()不是一個屬於LinkedSortedArrays而是不同的一個,需要一個DT &變量和LinkedSortedArraysfind()具有DT &類型爲const的參數),我發現可能的解決方案可能會將其編寫爲const_cast<DT&> (key)。我需要第二個意見。

最後,我明白這是不是一個具體的問題,因此我得到downvotes和/或問題被關閉。我根本不知道還有什麼要問的。 如果是我在錯誤的地方問的情況。我很抱歉。

+0

爲什麼不'find'通過const引用取它的參數? –

+0

Profesor希望如此:/ 它基本上是屬於另一個類的'find',它與'LinkedSortedArrays'一起構成數據結構。 – Yokhen

回答

2
  1. 是的,它會直到找到合適的catch處理器去堆棧。如果它找不到這樣的處理程序,程序將終止。

  2. 是的。

  3. 不,它不會,因爲end應該將一個迭代器返回到最後一個迭代器,而不是最後一個元素。除非那個容器設計得不好,但你必須查閱文檔以確保。

  4. 這是一個糟糕的設計,find應採取其參數const參考。既然你不能,你將不得不作出一個副本,除非你想冒險未定義行爲:

    DT nonconstkey = key; 
    return it->find(nonconstkey); 
    
+0

你對ArrayException和Exception之間的關係有什麼假設? –

+0

是的,我知道,我非常清楚需要複印件。幸運的是,現在我只使用'int's。所以現在沒什麼頭痛的。 – Yokhen

+0

@MooingDuck只有'Exception'不是'ArrayException'的子類。 –