2014-01-18 137 views
0

我猜這是比實際更假設的,但我想知道是否可以使用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; 
    } 
+0

你*可以*把它放在拉姆達,但我看不到點。 – chris

+0

'TestDate()'中的'switch'語句相當醜陋 - 如果測試不符合,所有情況都會通過,但它恰好工作,因爲如果任何早期測試失敗,後續測試也會失敗。也許它是這樣設計的,但它似乎是一個幸運的事故。 –

+0

@Michael:我在適當的位置放入了「break」語句,但是gcc編譯器發出了一個警告:「控制到達非void函數的末尾」。當「break」語句被省略時,我沒有收到任何警告。 – Huaidan

回答

2

switch語句沒有返回值,則return false或此類陳述中switch聲明適用於功能,他們在,所以你不能使用switchassert,但你可以把函數這個switch聲明在assert裏面。

0

您不能在assert內使用switchassert需要一個表達式。 switch是一個聲明,而不是一個表達式。

你可以做的是使用trinary操作符。如果您的switch聲明很大,這將不會很漂亮。

assert (((nMonth==1) || (nMonth == 3) || (nMonth == 5) || …) ? 
     ((nDay >= 1) && (nDay <= 31) : 
     (nMonth==2) ? ((nDay >= 1) && (nDay <= 28) : 
     …);