我猜這是比實際更假設的,但我想知道是否可以使用switch語句在'assert'中返回'true'或'false'。 我意識到有更好的方法來做到這一點,但我想從錯誤處理的角度看待這個問題,而不是清理用戶輸入。在「assert」中使用switch語句(C++)
例如,考慮使用輸入設置日期的Date類。在該類的SetDate()成員函數中,我想提出一個'assert'來處理由於輸入引起的錯誤,例如月份爲「13」,或月份爲「2」(2月)爲30天。這將是微不足道寫一個switch語句,這是否:
switch(nMonth){
case 1:
case 3:(etc)
if(nDay>=1 && nDay <=31)
return true;
else
return false;
(etc)
default:
return false;
}
假設switch語句作爲工作需要,我需要什麼做的,使其在「斷言」錯誤處理方案的工作?我按原樣試過,但(並不奇怪)它沒有編譯。
編輯: @餘浩: 這就是我如何修復它。我使用了一個bool函數。
bool TestDate(int nMonth, int nDay, int nYear){
switch(nMonth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if(nDay >=1 && nDay <=31)
return true;
break;
case 4:
case 6:
case 9:
case 11:
if(nDay >=1 && nDay <=30)
return true;
break;
case 2:
if((nYear % 400 == 0) || ((nYear % 100 !=0) &&(nYear % 4 == 0))){
if(nDay >=1 && nDay <=29)
return true;}
else if(nDay >=1 && nDay <=28)
return true;
else
return false;
break;
default:
return false;
}
return 0;
}
Date(int nMonth = 1, int nDay = 1, int nYear = 1970){
assert(TestDate(nMonth,nDay,nYear));
m_nMonth = nMonth;
m_nDay = nDay;
m_nYear = nYear;
}
你*可以*把它放在拉姆達,但我看不到點。 – chris
'TestDate()'中的'switch'語句相當醜陋 - 如果測試不符合,所有情況都會通過,但它恰好工作,因爲如果任何早期測試失敗,後續測試也會失敗。也許它是這樣設計的,但它似乎是一個幸運的事故。 –
@Michael:我在適當的位置放入了「break」語句,但是gcc編譯器發出了一個警告:「控制到達非void函數的末尾」。當「break」語句被省略時,我沒有收到任何警告。 – Huaidan