why i cant instantiate objects inside a switch-cas

2019-04-06 15:43发布

问题:

my code has 3 classes n_hexa,n_octa,n_bin. The code is here

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;
}

on compiling it gives a message "crosses initialisation of n_hexa" for line of n_octa

回答1:

If you want to have temporary objects inside a case, you'll need to scope them properly.

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;
    }
}


回答2:

Try declaring the variables above the switch command:

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


回答3:

Ebomike's post has the answer to get rid of the errors. Now the reason is,

From Standard docs 6.7.3,

It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A program that jumps77) from a point where a local variable with automatic storage duration is not in scope to a point where it is in scope is ill-formed unless the variable has trivial type (3.9) and is declared without an initializer (8.5).

An example from the Standard docs itself,

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
}

In which the statement goto lx; is ill-formed because it is being jumped to the statement lx, where the scope of a is visible.

Also,

77)The transfer from the condition of a switch statement to a case label is considered a jump in this respect.

So, this applies to switch as well.

And if braces {} are put in them, the scope is limited to the braces and you are free to declare within each case statement.

Hope that helps..