首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

这种状况是不是只能用Goto

2013-03-10 
这种情况是不是只能用Goto比如我有一些重复的代码块 比如代码A 代码B我有一个int jswitch(i){case 1:j10

这种情况是不是只能用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也可以
[解决办法]
引用:
尽量不用goto语句,你的例子中可以这样:
C/C++ code?12345678910switch(i){case 1:case 2:case 3:    j = i * 10;    代码A;    break;...}

支持!
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;
}

[解决办法]
引用:
C/C++ code?123456789101112131415int 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;
}

热点排行