为什么我无法在switch-case块中实例化对象

时间:2010-12-09 05:52:52

标签: c++ block switch-statement instantiation

我的代码有3个类n_hexa,n_octa,n_bin。代码在这里

switch(choice)
{
case 1: cin>>n; 
 n_hexa nx(n);
        break;
case 2: cin>>n; 
 n_octa no(n);
        break;
case 3: cin>>n;
 n_bin nb(n);
        break;
}

编译时会为n_octa行提供一条消息“跨越n_hexa的初始化

3 个答案:

答案 0 :(得分:11)

如果您想在案例中包含临时对象,则需要正确对其进行范围化。

switch(choice)
{
    case 1:
    {
         cin>>n; 
         n_hexa nx(n);
         break;
    }
    case 2:
    {
         cin>>n; 
         n_octa no(n);
         break;
    }
    case 3:
    {
         cin>>n;
         n_bin nb(n);
         break;
    }
}

答案 1 :(得分:2)

尝试在switch命令上面声明变量:

n_hexa nx;
n_octa no;
n_bin nb;
switch(choice) {
    case 1:
        cin>>n;
        nx(n);
        break;
...

答案 2 :(得分:2)

Ebomike的帖子有解决错误的答案。现在的原因是,

来自标准文档 6.7.3

  

可以转换为块,但不能以初始化绕过声明的方式。 一个程序   jumps77)从具有自动存储持续时间的局部变量不在其范围内的点到它所在的点   范围是格式不正确的,除非变量具有普通类型(3.9)并且在没有初始值设定项(8.5)的情况下声明。

标准文档本身的一个例子,

void f()
{
// ...
goto lx; // ill-formed: jump into scope of a
// ...
ly:
X a = 1;
// ...
lx:
goto ly; // OK, jump implies destructor
// call for a followed by construction
// again immediately following label ly
}

其中语句goto lx;格式错误,因为它被跳转到lx语句aswitch的范围可见。

此外,

  

77)从switch语句的条件到案例标签的转移在这方面被视为跳跃。

因此,这也适用于{}

如果将大括号case放入其中,则范围仅限于大括号,您可以在每个{{1}}语句中自由声明。

希望有所帮助..