我們假設我們正在實現一個自定義集合,其行爲類似於向量,並且如果集合爲空,我們想讓operator[]
引發一些異常。 std::vector
在這種情況下有未定義的行爲,但我們想拋出異常。如果這是C#,我們可能會投擲InvalidOperationException
。但在這種情況下哪個C++ exception會是最合適/直觀的?我覺得std::out_of_range
不是最好的選擇,因爲集合是空的,所以沒有「範圍」,索引將返回一個有效的(任何)元素。當對象的當前狀態不允許嘗試對其執行操作時拋出哪個異常?
5
A
回答
4
std::vector::at已經這樣做了。因此,您可以使用at
方法而不是operator []
。它爲無效索引投擲std::out_of_range
。
請注意,您將不得不做大量的工作來實現std::vector
的性能。但是,如果你想堅持自己的容器,並想從[]
,然後像at
方法std::out_of_range
是標準異常類的最佳選擇。否則,你需要定義你自己的自定義異常類。
+1
謝謝@taskinoor。我一直在執行這個定製集合,就像一個練習......所以這更像是一個假設性問題。除非有很好的理由這麼做,否則我肯定會避免在商業/生產軟件的情況下這樣做。 –
+1
@BojanKomazec爲了學習的目的,它完全沒問題,恕我直言。關閉主題評論:請看看'std :: allocator',您可能需要避免不必要的默認構造函數調用,並移動您可能需要的有效增長操作的語義。 – taskinoor
相關問題
- 1. pattern.Invoke()異常:由於對象的當前狀態,操作無效
- 2. 當試圖對其執行操作時拋出@autowired intance null,拋出空指針異常
- 3. 嘗試在iOS8上創建TFileStream對象時不允許操作
- 4. SSRS異常由於對象的當前狀態,操作無效。和AspNetSessionExpiredException
- 5. 當屬性設置器不允許時拋出什麼異常?
- 6. 當對象關閉時不允許操作
- 7. Excel VBA - SQL調用 - 當對象關閉時不允許操作
- 8. 當使用vb6關閉對象時不允許操作
- 9. 「當對象打開時不允許操作」
- 10. Npgsql的C#拋操作無效由於對象的當前狀態突然
- 11. SqlDataReader對象在每次執行操作時都會拋出異常
- 12. XtraTreelist:操作無效由於對象的當前狀態 - 的DragDrop
- 13. SqlPubWiz命令行:錯誤:操作對對象的當前狀態無效
- 14. 操作無效由於對象的當前狀態
- 15. 由於對象的當前狀態,操作無效
- 16. 由於對象的當前狀態,操作無效。在C#
- 17. VB.net由於對象的當前狀態,Oracle操作無效
- 18. System.InvalidOperationException:由於對象的當前狀態,操作無效。
- 19. 由於對象錯誤的當前狀態,操作無效
- 20. OracleConnection.ClearAllPools - 操作無效由於對象的當前狀態
- 21. 由於對象的當前狀態,操作無效
- 22. 「當對象打開時不允許操作」VB6中出現錯誤
- 23. 當詢問DOM對象時,XMLHttpRequest.send()拋出異常
- 24. 對象指針狀態新的構造後拋出異常 - C++
- 25. 拋出異常對象
- 26. 對象類拋出類拋出異常
- 27. 當試圖在Visual Studio 2017中添加新連接時,「操作無效,由於對象的當前狀態」
- 28. 如何操作當前對象的
- 29. ZK:當拋出異常模態窗口不能正常工作
- 30. 嘗試安裝pip模塊時操作不允許出錯
其實我認爲'std :: out_of_range'確實是我會使用的異常。如果容器是空的,那麼任何索引超出範圍,這與'std :: vector'已經運行的方式相同。記住一個空集仍然是一組(在數學意義上) – CoryKramer
恕我直言,我認爲每個人都會明白你對'std :: out_of_range'的使用。即使您鏈接到的參考站點也有*定義了要拋出的對象類型作爲例外。它報告錯誤,這是嘗試訪問超出定義範圍的元素的結果。*非常適合這種情況。 – NathanOliver
vector :: at'會在vector爲空時拋出'std :: out_of_range',所以我相信這確實是一個正確的例外。 – SirDarius