我有一個包含一個成員變量的類,該成員變量是自定義對象的列表。我試圖編寫一個getter函數,通過這個列表來查找試圖找到提供名稱的列表。如果找到,我想通過常量引用返回所述對象,或者只輸出「Object with name」name「not found」。否則,不會崩潰我的程序。有任何想法嗎?我想我可以做另一個函數,只是返回一個布爾值,如果匹配的對象存在,並首先調用。如果它返回true,那麼獲取給定的項目。但是,這是低效的,我想做得更好。Getter函數不會在未找到對象時崩潰
0
A
回答
2
選項:
拋出一個異常沒有找到的時候 - 抓住它的調用者
返回一個迭代 - 檢查
== .end()
,以確定是否在來電者未找到(STL做到這一點)具備的功能返回一個指針,並返回
NULL
,如果沒有找到具有指示的特殊對象沒有找到,返回一個引用時沒有發現
檢查是否存在事前(如你所提到的)
+0
我會在指針上使用一個可選的包裝。它防止額外的副本和堆分配。 – pmr 2013-02-24 01:35:33
0
,你必須分離存在確認和價值理念迴音,是健全的。
這本質上並不低效,無論如何,爲什麼不試一試,看看它是否成爲瓶頸?如果第一次執行似乎效率低下,則緩存一個提示或者檢查的整個結果
否則,您的選項包括在找不到時拋出異常,並使用Baron/Nackman Fallible
類的某些實現作爲函數的結果,如boost::optional
(或只是自己推出)
而且,考慮一下,你可以返回一個指針。這對於指針或數組對象類型來說可能很尷尬,但通常應該是最乾淨的解決方案。返回一個空指針來指示「未找到對象」。
0
可以提供2個版本的訪問器,一個拋出異常,或默默返回空對象,另一個具有參數報告,該數據不存在:
class Props {
public:
const Object &get(const std::string &name) const; // throws exception or silently retruns empty
const Object &get(const std::string &name, bool &found) const; // returns flag
};
在C++ 11也可能是更清潔:
class Props {
public:
const Object &get(const std::string &name, bool &&found = bool()) const;
};
我會拿回來的C + + 11版本,我不是很熟悉新的語言功能,這似乎並沒有更清潔。
相關問題
- 1. COUT打印後崩潰對象的getter
- 2. Getter正在崩潰程序
- 3. 未找到函數內的對象
- 4. TypeError:在對象中找不到函數
- 5. EGL在第一個opengl函數崩潰時崩潰
- 6. Linq表達式崩潰時,它找不到我在找什麼
- 7. 遞歸函數在運行時崩潰
- 8. 將對象插入到數組中時崩潰
- 9. Haskell System.Timeout.timeout在從某個函數調用時會崩潰
- 10. 從NSMutableArray中刪除對象時崩潰
- 11. Pop()函數崩潰
- 12. UIColor函數崩潰
- 13. Lua函數在使用Luabind比較存儲的C++對象指針時崩潰
- 14. 如何防止未找到引用的程序集時崩潰?
- 15. 運行時出現SquarePointOfSaleSDK崩潰 - 未找到圖像
- 16. 訪問UILabel對象崩潰
- 17. 管理對象崩潰EXC_BAD_ACCESS
- 18. 分佈式對象崩潰
- 19. 釋放自動釋放的字符串對象不會崩潰
- 20. 雙釋放自動釋放對象不會崩潰
- 21. 對象在主程序中崩潰,但不在移動到單元時
- 22. Getter/Setter正在崩潰我的代碼,但在函數中正常
- 23. Python Selenium在找不到元素時崩潰
- 24. 調用一個不訪問空對象指針上的數據的方法有時會起作用,有時會崩潰。爲什麼它不總是崩潰?
- 25. AsyncTask GeoCoder有時會崩潰?
- 26. 在崩潰時,Firebase的「崩潰報告」會自動報告嗎?
- 27. NGINX崩潰404找不到錯誤
- 28. 調用OpenGL函數時程序崩潰
- 29. 調用虛擬函數時崩潰
- 30. Windows應用程序在調試時不會崩潰,但崩潰否則
你可以使用'std :: list'和'std :: find()'嗎? – Johnsyweb 2013-02-24 01:25:16