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: 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: 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. |
|
pekfos |
» 2013-11-22 21:31:26 Podaj kod, którego dotyczy błąd. |
|
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: 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: 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 ); 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) ;) |
|
kynol |
» 2013-11-22 23:14:58 W tej czesci: case 0: Menu playMenu( applicationWindow, 3 ); switch( playMenu.display()
wstaw zamiast tego to: case 0: playMenu( applicationWindow, 3 ); switch( playMenu.display()
I powiedz czy pomoglo;P |
|
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 {}. |
|
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.
|
|
« 1 » |