在“assert”中使用switch语句(C ++)

时间:2014-01-18 04:49:03

标签: c++ switch-statement assert

我想这更像是假设而不是实际,但我想知道是否可以使用在'assert'中返回'true'或'false'的switch语句。 我意识到有更好的方法可以做到这一点,但我想从错误处理方面来看待这个问题,而不是消除用户输入。

例如,考虑一个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语句按预期工作,我需要做些什么才能使它在'assert'错误处理方案中工作?我按原样尝试了,但(不出意外)它没有编译。

编辑: @Yu Hao: 这就是我修复它的方式。我使用了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;
    }

2 个答案:

答案 0 :(得分:2)

switch语句没有返回值,return false语句中的switch或此类语句适用于它们所在的函数。所以你可以在switch内使用assert,但您可以将switch语句放在assert内的函数

答案 1 :(得分:0)

您无法在switch内使用assertassert表达了。 switch是一个陈述,而不是表达。

你可以做的是使用三元运算符。如果您的switch声明很大,那就不太好了。

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