Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z deklaracją obiektów w switchu

Ostatnio zmodyfikowano 2013-11-23 12:35
Autor Wiadomość
rafixxx25
Temat założony przez niniejszego użytkownika
Problem z deklaracją obiektów w switchu
» 2013-11-22 21:19:53
Oto mój uproszczony kod:
C/C++
Klasa obiekt1( 0 );
Klasa obiekt2( 1 );
Klasa obiekt3( 2 );
do
{
    switch( obiekt1.funkcja() )
    {
    case 0:
        switch( obiekt2.funkcja() )
        {
        case 1:
            switch( obiekt3.funkcja() )
            {
            case 0:
                Klasa obiekt4( 3 );
                switch( obiekt4.funkcja() )
                {
                case 0:
                    ...
                    break;
                case 1:
                    ...
                    break;
                }
            }
            break;
        }
    }
} while( warunek )
Dlaczego w takim wypadku wszystko jest ok, ale gdy zapiszę tak:
C/C++
Klasa obiekt1( 0 );
Klasa obiekt2( 1 );
do
{
    switch( obiekt1.funkcja() )
    {
    case 0:
        switch( obiekt2.funkcja() )
        {
        case 1:
            Klasa obiekt3( 2 );
            switch( obiekt3.funkcja() )
            {
            case 0:
                Klasa obiekt4( 3 );
                switch( obiekt4.funkcja() )
                {
                case 0:
                    ...
                    break;
                case 1:
                    ...
                    break;
                }
            }
            break;
        }
    }
} while( warunek )
To zwraca mi błąd:
error C2360: initialization of 'Klasa' is skipped by 'case' label
1>          main.cpp(47) : see declaration of 'Klasa'
Chodzi mi o to, dlaczego obiekt4 mogę zadeklarować w jednym case, ale obiekt3 już nie, skoro używam tego obiektu tylko w case?
//Upraszczając kod chyba coś poknociłem z nawiasami, ale to raczej nie jest ważne.
P-97080
pekfos
» 2013-11-22 21:31:26
Podaj kod, którego dotyczy błąd.
P-97081
rafixxx25
Temat założony przez niniejszego użytkownika
» 2013-11-22 23:04:34
Dobra, wkleję dokładnie ten fragment który mam. Oto dobrze kompilujący się kod:
C/C++
Menu mainMenu( applicationWindow, 0 );
Game game1( applicationWindow, 1 );
Game game2( applicationWindow, 2 );
Game game3( applicationWindow, 3 );
Menu optionsMenu( applicationWindow, 1 );
Menu playMenu( applicationWindow, 3 );
Menu control( applicationWindow, 4 );
bool end;
do
{
    end = false;
    switch( mainMenu.display() )
    {
    case 0:
        switch( playMenu.display() )
        {
        case 0:
            if( game1.start() )
            if( game2.start() )
                 game3.start();
           
            break;
        case 1:
            if( game2.start() )
                 game3.start();
           
            break;
        case 2:
            game3.start();
            break;
        }
        break;
    case 1:
        switch( optionsMenu.display() )
        {
        case 0:
            Menu graphicsMenu( applicationWindow, 2 );
            switch( graphicsMenu.display() )
            {
            case 0:
                verticalSync = !verticalSync;
                break;
            case 1:
                break;
            }
        }
        break;
    case 2:
        control.display();
        break;
    case 3:
        end = true;
        break;
    default:
        break;
    }
} while( applicationWindow.isOpen() && !end );

A oto kod z błędem:
C/C++
Menu mainMenu( applicationWindow, 0 );
Game game1( applicationWindow, 1 );
Game game2( applicationWindow, 2 );
Game game3( applicationWindow, 3 );
Menu optionsMenu( applicationWindow, 1 );
Menu control( applicationWindow, 4 );
bool end;
do
{
    end = false;
    switch( mainMenu.display() )
    {
    case 0:
        Menu playMenu( applicationWindow, 3 ); //Tutaj zmiana
        switch( playMenu.display() )
        {
        case 0:
            if( game1.start() )
            if( game2.start() )
                 game3.start();
           
            break;
        case 1:
            if( game2.start() )
                 game3.start();
           
            break;
        case 2:
            game3.start();
            break;
        }
        break;
    case 1:
        switch( optionsMenu.display() )
        {
        case 0:
            Menu graphicsMenu( applicationWindow, 2 );
            switch( graphicsMenu.display() )
            {
            case 0:
                verticalSync = !verticalSync;
                break;
            case 1:
                break;
            }
        }
        break;
    case 2:
        control.display();
        break;
    case 3:
        end = true;
        break;
    default:
        break;
    }
} while( applicationWindow.isOpen() && !end );


>main.cpp(47): error C2360: initialization of 'playMenu' is skipped by 'case' label
1>          main.cpp(30) : see declaration of 'playMenu'
1>main.cpp(62): error C2360: initialization of 'playMenu' is skipped by 'case' label
1>          main.cpp(30) : see declaration of 'playMenu'
1>main.cpp(65): error C2360: initialization of 'playMenu' is skipped by 'case' label
1>          main.cpp(30) : see declaration of 'playMenu'
1>main.cpp(68): error C2361: initialization of 'playMenu' is skipped by 'default' label
1>          main.cpp(30) : see declaration of 'playMenu'
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
PS: Wiem, że kod jest BARDZO brzydki i właśnie planuję go lepiej napisać(m.in. dlatego planuję tworzenie obiektów wrzucić do switcha) ;)
P-97089
kynol
» 2013-11-22 23:14:58
W tej czesci:
C/C++
case 0:
Menu playMenu( applicationWindow, 3 ); //Tutaj zmiana
switch( playMenu.display()

wstaw zamiast tego to:

C/C++
case 0:
playMenu( applicationWindow, 3 ); //Tutaj zmiana
switch( playMenu.display()

I powiedz czy pomoglo;P
P-97091
Mitu
» 2013-11-22 23:16:31
Deklaracja jest dla całej klamry, czyli dla całego switcha. Jeśli w switchu jest więcej niż jeden case, to deklaracja może zostać pominięta w niektórych wypadkach i jest to błąd. Możesz zawęzić jej zakres ważności do jednego case'a używając klamer {}.
P-97092
rafixxx25
Temat założony przez niniejszego użytkownika
» 2013-11-23 12:35:40
@kynol, prawdopodobnie zadziałałoby, ale nie tego szukałem.
@Mitu, Rzeczywiście zamknięcie w klamry pomogło.
Dzięki za pomoc.
P-97117
« 1 »
  Strona 1 z 1