牛逼!再也不用长长的Switch语句了

一提到switch,难免出来许多case,代码长而不爽,工程效率也大大下降

举例说明:

一个学生管理系统,定义各种菜单栏,用户在控制台进行输入,由输入自主选择菜单。

1. 菜单栏声明如下,具体实现略去

代码语言:javascript
复制
class Menu
{
    public:
        void Welcome();
        void TypeIn(Data *&d);
        void DeletaData(Data *&d);
        void ADDData(Data *&d);
        void FindData(Data *&d);
        void SortData(Data *&d);
        void Statistics(Data *&d);
        void Modification(Data *&d);
        bool Modification_data(Data *&h,int i);
        void DisplyData(Data *&d);
        void Save(Data *&d);
     }

2. 用户进行菜单选择

Switch-Case常规写法:

代码语言:javascript
复制
Menu MM;
void MenuSelect(Data *&d)
{
    int input=0;
    while(scanf("%d",&input)!=EOF)
    {
        if(input <1 || input>9)
        {
            cout<<"输入范围在1~9,请重新输入"<<endl;
            continue;
        }
        //进行菜单选择
        switch(input)
        {
            case 1:
            {
                MM.TypeIn(d);
                break;
            }
            case 2:
            {
                MM.SortData(d);
                break;
            }
            case 3:
            {
                MM.ADDData(d);
                break;
            }
            case 4:
            {
                MM.FindData(d);
                break;
            }
            case 5:
            {
                MM.DeletaData(d);
                break;
            }
            case 6:
            {
               MM.Statistics(d);
                break;
            }
            case 7:
            {
               MM.Modification(d);
                break;
            }
            case 8:
            {
                MM.DisplyData(d);
                break;
            }
             case 9:
            {
                MM.Save(d);
                return;//退出
            }
        }
       MM.Welcome();
    }
}

再也不用Switch之一:

代码语言:javascript
复制
//定义的函数类型,返回值与形参与Menu中一致
typedef void(Menu::*Fun_Name)(Data*&);
typedef struct Selet
{
    int choice_input;
    Fun_Name fun_name;

}_Select;

_Select SS[9]=
{
{1,&Menu::TypeIn},
{2,&Menu::SortData},
{3,&Menu::ADDData},
{4,&Menu::FindData},
{5,&Menu::DeletaData},
{6,&Menu::Statistics},
{7,&Menu::Modification},
{8,&Menu::DisplyData},
{9,&Menu::Save}
};
int _leng=sizeof(SS)/sizeof(SS[0]);

void MenuSelect(Data *&d)
{
int input=0;
while(scanf("%d",&input)!=EOF)
{
if(input <1 || input>9)
{
cout<<"输入范围在1~9,请重新输入"<<endl;
continue;
}
for(int i=0;i<_leng;i++)
{
if(input == SS[i].choice_input)
{
(MM.*SS[i].fun_name)(d);
}
}
MM.Welcome();
}
}

再也不用Switch之二:

代码语言:javascript
复制
typedef void (Menu::*Select_Fun)(Data *&d);
Select_Fun _SSL[]=
{
&Menu::TypeIn,
&Menu::TypeIn,//从0开始,输入从1开始
&Menu::SortData,
&Menu::ADDData,
&Menu::FindData,
&Menu::DeletaData,
&Menu::Statistics,
&Menu::Modification,
&Menu::DisplyData,
&Menu::Save
};

void _Fun(Data &d,int flag)
{
Select_Fun _funselect = _SSL[flag];
(MM.
_funselect)(d);
}

void MenuSelect(Data *&d)
{
int input=0;
while(scanf("%d",&input)!=EOF)
{
if(input <1 || input>9)
{
cout<<"输入范围在1~9,请重新输入"<<endl;
continue;
}
_Fun(d,input);
MM.Welcome();
}
}