这种情况是不是只能用Goto
比如我有一些重复的代码块 比如代码A 代码B
我有一个
int j;
switch(i){
case 1:
j=10;
代码A;
break;
case 2:
j=20;
代码A;
break;
case 3:
j=30;
代码A;
break;
case 10:
j=100;
代码B;
break;
case 20:
j=200;
代码B;
break;
case 30:
j=300;
代码B;
break;
}
[解决办法]
代码A和B有什么特点?你的goto打算加在什么地方?
[解决办法]
你就不能根据switch的结果再决定是A或B吗,在我看来goto目前的最大作用还是跳出多重循环,其他场合都有不错的代用品。
[解决办法]
尽量不用goto语句,你的例子中可以这样:
switch(i)
{
case 1:
case 2:
case 3:
j = i * 10;
代码A;
break;
...
}
[解决办法]
switch(i){
case 1:
case 2:
case 3:
case 10:
case 20:
case 30:
j=i*10;
代码B;
break;
}
或者函数调用 或者宏展开 等等 各种方式 当然goto也可以
[解决办法]
支持!
switch(i)
{
case 1:
case 2:
case 3:
j = i * 10;
代码A;
break;
case 10:
case 20:
case 30:
j = i * 10;
代码B;
break;
}
[解决办法]
可以用MFC消息循环中的分发函数用的方法来做
int j;
struct _vTableFunc{
int ival;
int idata;
int funcNum;
} vtable[] =
{
1, 10, 1,
2, 20, 1,
3, 30, 1,
10, 100, 2,
20, 200, 2,
30, 300, 2,
40, 400, 3,
50, 500, 3,
0, 0, 0, // 如果没有匹配数据,则全为0
};
int k=0;
for (k=0; k<sizeof(vtable)/sizeof(struct _vTableFunc)-1; k++)
{
if (vtable[k].ival == i)
{
j = vtable[k].idata;
break;
}
}
if (vtable[k].funcNum == 1)
{
// 代码A;
}
else if(vtable[k].funcNum == 2)
{
// 代码B;
}
else if (vtable[k].funcNum == 3)
{
// 代码C;
}
[解决办法]
int j;
switch(i){
case 1:
case 2:
case 3:
j=i*10;
代码A;
break;
case 10:
case 20:
case 30:
j=i*100;
代码B;
break;
}
[解决办法]
代码B前面应为j=i*10;
[解决办法]
我不知道factory pattern是否适合解决你的问题
你可以上网找一找简单的例子
http://en.wikipedia.org/wiki/Factory_method_pattern
如果需要复用性高,而且可以customize的factory
modern c++ design的8,9章有很不错的实作
[解决办法]
switch(i){
case 1:
case 2:
case 3:
代码A;
break;
case 10:
case 20:
case 30:
代码B;
break;
}
代码A:
switch(i){
case 1:
j=1;
break;
case 2:
j=2;
break;
case 3:
j=3;
break;
}
代码B:
switch(i){
case 10:
j=10;
break;
case 20:
j=20;
break;
case 30:
j=30;
break;
}