2010-05-20 32 views
4

我已經創建了一個可變粒度日程表中的時隙模型的類,例如,第一個時隙是30分鐘,但第二個時隙可以是40分鐘,第一個可用插槽開始於(可比值爲)1.C++:定義一個類的最大/最小限制

我現在想要做的是定義該類所需的最大和最小允許值,並且我有兩個實際問題以便這樣做:

1.-定義絕對最小值和最大值是否有用於自定義類?或者更好的是,只要一個值總是比較低於任何其他可能的類型值,給定類的定義關係運算符,定義爲min? (和模擬的最大值)

2.-假設前面的問題有一個答案在「是」(或「是,但是......」)後建模,如何定義這樣的max/min?我知道有std::numeric_limits<>,但從我讀的它是用於「數字類型」。我是否將其解釋爲「以數字表示」的含義,還是我可以制定一個更廣泛的假設,如「用數字表示」或「與整數具有對應關係」?畢竟,定義日期類和字典類的最小值和最大值是有意義的,但numeric_limits可能不適用於這些用途(我沒有太多的經驗)。另外,numeric_limits有很多額外的成員和信息,我不知道該怎麼做。如果我不需要使用numeric_limits,C++提供了哪些其他衆所周知的/廣泛使用的機制來指示類的可用值範圍?

回答

1

只需創建一些反映最小值和最大值的常量靜態成員即可。

2

難以理解你的問題。我認爲你所要問的是,對於班級的領域(可以提供給它的數據和有意義的數據)是否有意義,如果是的話,如何自信。

第一個有一個非常明確的答案:是的,絕對。你希望你的班級成爲「......容易正確使用,難以正確使用」。這包括確保班上的客戶在他們做錯事情時被告知。

第二個答案不太清晰。很多時候,你只是想使用assert()函數來斷言一個函數或類的域。其他時候你會想拋出一個異常。有時候你想要這樣做。當性能可能成爲問題時,有時候你想提供一個既不支持也不支持的接口。通常,您希望提供一個至少可以進行檢查的接口,以便客戶端在嘗試將其提供給您的類或函數之前可以知道什麼是有效/無效輸入。

您可能想要斷言和拋出的原因是因爲拋出異常破壞堆棧信息並且可能會使調試變得困難,但斷言僅在構建過程中發生,並且實際上並沒有做任何事情來保護您免於運行計算或執行任何操作這可能導致崩潰或使數據無效。因此斷言然後拋出通常是最好的答案,以便您可以在測試時進行調試,但在這些錯誤進入架子時仍能保護用戶。

對於你的班級,你可能會考慮一些方法來提供最小/最大值。一種是在類的界面中提供最小/最大功能。另一個可能是使用外部功能,是的,numeric_limits可能只是因爲範圍有時是一種數字量。你甚至可以提供一個更通用的接口,在你的類中有一個validate_input()函數,這樣你就可以進行任何可能適合的比較。

你的問題的第二部分有很多有效的答案取決於包括個人品味在內的許多變量。

+0

感謝您的回答,諾亞。是的,我認爲我有時候過於冗長,但你似乎沒有任何問題,並且完全去了我想去的地方。 是的,我想「對我班的域名保持自信」。使用斷言或try/catch來確保我沒有搞錯代碼,我沒有太多麻煩,我只想要兩件事:能夠向我的客戶提供相同(或類似)的信息,以便他們也可以相應地做出決定,並且可以以自然的方式提供信息。 感謝您提供通用驗證界面的提示。 – luismachuca 2010-05-20 17:46:22

2

作爲您的日程安排/插槽代碼的設計者,您需要多少靈活性/實用性取決於您。

兩個簡單的方法是要麼在該類

const long MIN_SLOT = 1; 
const long MAX_SLOT = 999; // for example 

定義自己的價值觀或定義保存定義

都將枚舉
class SchedLimits{ 

public: 
const static long MIN_SLOT = 1; 
const static long MAX_SLOT = 999; 
} 

最簡單的類。 (感謝提醒我那些評論者)

enum {MIN_SLOT = 1, MAX_SLOT = 999}; 
+0

最簡單的方法幾乎總是最好的。 – Crashworks 2010-05-20 17:43:14

+0

...更好的是,使用枚舉:'enum {MIN_SLOT = 1,MAX_SLOT = 999};',並且您可以使用它們編譯時間。 – 2010-05-20 17:45:06

+0

枚舉也是一個好主意。我會編輯我的答案以反映這一點。 – 2010-05-20 17:49:10

相關問題