why i cant instantiate objects inside a switch-case block

前端 未结 3 795
无人及你
无人及你 2021-02-15 12:36

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          


        
相关标签:
3条回答
  • 2021-02-15 12:46

    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..

    0 讨论(0)
  • 2021-02-15 12:54

    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;
    ...
    
    0 讨论(0)
  • 2021-02-15 13:05

    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;
        }
    }
    
    0 讨论(0)
提交回复
热议问题