2010-07-30 68 views
0

我正在構建一個框架,我需要錯誤檢查類。我不能使用例外(不允許)。我決定創建一個由所有需要錯誤報告的類繼承的類,這些類的功能如ReportError() [爲類本身]和GetError() [獲取最後一個錯誤 - 由調用者使用]以及函數添加自定義錯誤稱爲AddError(/ *參數* /)。該類有一個名爲FW_ERROR_TYPES的枚舉類型,它有一些最常見的默認錯誤類型。例如,FW_ERROR_INIT(未正確初始化),FW_ERROR_CTOR(構造對象期間的錯誤)等。當類報告錯誤時,還可以添加可選的描述(已記錄)(可用於以後的分析以查看發生了什麼錯誤)。這一切都很好,並且對我的目的來說很好。關於繼承枚舉的設計問題

問題來了,當我想添加自定義錯誤。自定義錯誤不能被添加爲FW_ERROR_TYPES,因爲枚舉不會被繼承錯誤類的類繼承。我在設計錯誤類時並沒有預見到這個問題。我原來的「設計」是,當GetError()被調用,以獲得最後一個錯誤,它會返回一個FW_ERROR_TYPES,所以使用像這樣的時候,將產生一個編譯器錯誤:

if (SomeClass->GetError()) // OR 
if (SomeClass->GetError()) == true) 

也就是說,它會強制誰正在使用它來專門檢查FW_ERROR_TYPES。當我發現繼承錯誤類的類不能擴展FW_ERROR_TYPES枚舉時,我不得不使用泛型枚舉並強制GetError()返回一個無符號整數。我將unsigned int定義爲FW_ERROR_TYPE,以便至少有一些指示表明正在返回一個錯誤代碼。

唷!所以我的問題是,我怎樣才能改進這個設計(或者廢棄它並使用更好的設計)?有沒有辦法繼承枚舉類型?我看着codeproject網站,發現一個相當複雜的解決方案(如果一切都失敗了,我會放棄)。任何幫助將不勝感激。

謝謝!

回答

1

你可以讓你的錯誤值是一個類而不是一個枚舉。您可能有一個基類錯誤類FwError,並帶有有用的方法,如GetMessage(),然後有多種從該基類錯誤類繼承的錯誤類型。當您必須檢查返回的錯誤是否爲某種類型的錯誤時,可以使用運行時類型信息來檢查錯誤類型。如果需要創建新類型的錯誤,則可以從基類錯誤類或更具體的子類繼承。如果一個調用者得到了一個它從來沒有聽說過的類型的錯誤,那麼多態性可以確保它仍然可以像一個基礎FwError一樣處理它,並打印一條有意義的消息。

+0

這不是一個壞主意。我預測的唯一問題是RTTI是一個昂貴的操作,而檢查編號枚舉的速度要快得多。 感謝您的想法,但我會記住,當我需要這種類型的錯誤檢查,而不必擔心性能太多。 – Samaursa 2010-08-01 04:53:10