| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 698 人关注过本帖
标题:为什么类对象定义放在条件块中会发生编译错误?
只看楼主 加入收藏
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
 问题点数:0 回复次数:8 
为什么类对象定义放在条件块中会发生编译错误?

有这样一段代码:

class NoJump
{
public:
NoJump() {}
};

void FunNoJump(int i)
{
switch (i)
{
case 1:
NoJump aa; //编译出错提示: error C2360: initialization of 'aa' is skipped by 'case' label, see declaration of 'aa'
break;
case 2:
NoJump bb; //编译出错提示:error C2360: initialization of 'bb' is skipped by 'case' label, see declaration of 'bb'
break;
case 3:
break;
}
}

修改后:
void FunNoJump(int i)
{
switch (i)
{
case 1:
{//加上括号
NoJump aa;
}//加上括号
break;
case 2:
{//加上括号
NoJump bb;
}//加上括号
break;
case 3:
break;
}
}

编译通过,没有想明白为什么。。。。

搜索更多相关主题的帖子: 定义 case 对象 NoJump 编译 
2006-09-06 11:17
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
在C++编程思想一书中有这样的描述,但还是没有真正理解
在C++编程思想一书中有这样的描述,但还是没有真正理解。。。
图片附件: 游客没有浏览图片的权限,请 登录注册


谷底深深行 ,峰顶漫漫步......@_@
2006-09-06 18:22
wangxiang
Rank: 2
等 级:新手上路
威 望:5
帖 子:376
专家分:0
注 册:2006-3-28
收藏
得分:0 

switch (i)
{
case 1:
NoJump aa; break;
case 2:
NoJump bb; break;
case 3:
break;
}
假如i = 2;则执行case 2的语句,从语法上讲case 2可以执行aa这个变量,但代码执行时却又没有执行 NoJump aa; 这一句,这是矛盾的。
所以必须加上{}限制变量的作用域


2006-09-06 20:39
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

楼上正解


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-09-06 21:57
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 
以下是引用wangxiang在2006-9-6 20:39:57的发言:

switch (i)
{
case 1:
NoJump aa; break;
case 2:
NoJump bb; break;
case 3:
break;
}
假如i = 2;则执行case 2的语句,从语法上讲case 2可以执行aa这个变量,但代码执行时却又没有执行 NoJump aa; 这一句,这是矛盾的。
所以必须加上{}限制变量的作用域

非常感谢wangxiang的解释,但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?


谷底深深行 ,峰顶漫漫步......@_@
2006-09-07 10:50
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 
但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?

意思是说case上面的这个aa已经声明了,根据作用域的规定,aa已经出现了,(都在switch这一个块中)所以下面的case就可以对aa进行操作,但是,当操作的时候又会发现,他没有定义。
因为没有进入case 1而是直接进了case 2,这样就矛盾了,加个{}规定aa的域。就不会产生矛盾了


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-09-07 11:08
olivezhang
Rank: 1
等 级:新手上路
帖 子:223
专家分:0
注 册:2005-9-14
收藏
得分:0 

谢谢wfpb版主的点拨,谢谢两位的帮助,现在明白了.:)


谷底深深行 ,峰顶漫漫步......@_@
2006-09-07 11:18
心动音符
Rank: 1
等 级:禁止访问
威 望:1
帖 子:832
专家分:0
注 册:2005-9-15
收藏
得分:0 
以下是引用wfpb在2006-9-7 11:08:42的发言:
但是"从语法上讲case 2可以执行aa这个变量"是什么意思呢?
当i=2时,从语法上讲case 2不是应该执行bb这个变量吗?

意思是说case上面的这个aa已经声明了,根据作用域的规定,aa已经出现了,都在switch这一个块中)所以下面的case就可以对aa进行操作,但是,当操作的时候又会发现,他没有定义。
因为没有进入case 1而是直接进了case 2,这样就矛盾了,加个{}规定aa的域。就不会产生矛盾了

BZ 我不太明白 这句话是什么意思啊。
比如我的代码是:
#include <iostream.h>
int main()
{int i=2;
switch(i)
{
case 1: cout<<"aa"<<endl;
case 2: cout<<"bb"<<endl;
case 3: cout<<"cc"<<endl;
}
return 0;
}
而我执行的只是后两句啊“cout<<"2"<<endl; cout<<"3"<<endl;”并没有执行cout<<"1"<<endl;
为什么说:根据作用域的规定,aa已经出现了,作用域是如何规定的啊?


2006-09-07 13:36
wfpb
Rank: 6Rank: 6
等 级:贵宾
威 望:29
帖 子:2188
专家分:0
注 册:2006-4-2
收藏
得分:0 

变量有局部和全局之分。
全局就不用说了
局部就是在{}之间的。
当然,如果在某些时候只有一个语句时也是局部。比如if(i==0)int a;
那只是因为{}被省略了。

所以,{}是决定她里面声明的变量的生命周期。
由于在前面的case语句中已经有了aa这个变量出现了,按照{}的规定,aa就应该在下面的case操作中可以用到了,但是实际上NoJump aa;或许没有执行,那么就会产生矛盾,所以加个{}就规定了,aa只是在第一个case中的生命周期。


[glow=255,red,2]wfpb的部落格[/glow] 学习成为生活的重要组成部分!
2006-09-07 16:43
快速回复:为什么类对象定义放在条件块中会发生编译错误?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023617 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved