2013-02-24 59 views
0

我有一個包含一個成員變量的類,該成員變量是自定義對象的列表。我試圖編寫一個getter函數,通過這個列表來查找試圖找到提供名稱的列表。如果找到,我想通過常量引用返回所述對象,或者只輸出「Object with name」name「not found」。否則,不會崩潰我的程序。有任何想法嗎?我想我可以做另一個函數,只是返回一個布爾值,如果匹配的對象存在,並首先調用。如果它返回true,那麼獲取給定的項目。但是,這是低效的,我想做得更好。Getter函數不會在未找到對象時崩潰

+0

你可以使用'std :: list'和'std :: find()'嗎? – Johnsyweb 2013-02-24 01:25:16

回答

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版本,我不是很熟悉新的語言功能,這似乎並沒有更清潔。