2015-02-12 5 views
-1

У меня возникли проблемы с пониманием моего оператора C++ switch.Поведение оператора switch в C++

Я должен ввести принятый целочисленный интервал дважды, чтобы функция вернулась к коммутатору. А потом он падает прямо к случаю 2.

наследуемых Класс:

class Fugl : public DyrLuft 
{ 
    private: 
    int alder; 

    public: 
    Fugl() : DyrLuft() 
     { }           
    void les() 
     { 
     do 
     { 
     cout << "\nSkriv inn fuglens alder: "; 
     cin >> alder; 
     if(alder < 0 || alder > 130) 
      cout << "\nDenne alderen virket usannsynlig, prøv igjen!\n"; 
     } while(alder < 0 || alder > 130); 
     } 
}; 

Главная:

int main() 
{ 
    char valg = '\q'; 
    cout << "Hvilken dyreart ønsker du å registrere? (Q for å avslutte)" 
    << "\n1) - Fugl \n2) - Fisk \n3) - Insekt \n4) - Skalldyr\n"; 
    do 
    { 
    cin >> valg; 
    switch(valg) 
     { 
     case '1': 
     { 
     Fugl fugl; fugl.les(); 
     } break; 
     case '2': 
     { 
     Fisk fisk; fisk.les(); 
     } break; 
     case '3': 
     { 
     Insekt insekt; insekt.les(); 
     } break; 
     case '4': 
     { 
     Skalldyr skalldyr; skalldyr.les(); 
     } break; 
     case 'Q': return 0; 
     case 'q': return 0; 
     default: cout << "Velg en av ovennevnte!\n"; 
     } 
    } while(valg != 'Q' || valg != 'q'); 
    return 0; 
} 
+1

какие входные данные? – Matt

+0

Является ли '' \ nDenne alderen virket usannsynlig, prøv igjen! \ N "'напечатано между вводом' alder'? – IllusiveBrian

+0

'char valg = '\ q';' кажется неправильным, но это не должно быть причиной вашей проблемы, так как 'valg' скоро перезаписывается ... Кроме того, что находится в' DyrLuft() '? Это вызывается, когда вы объявляете «Fugl fugl;». – rubikonx9

ответ

0

Я не знаю, что происходит в вашем случае, но я побежал ваш код, и он отлично работает для меня. Введено 1,4, Q и программа вышла как ожидалось .... Может быть компилятор или проблема класса DyrLuft (я просто удалил наследование, чтобы заставить его работать, а также строки из case 2,3,4).

+0

Я попытался удалить все остальные классы и заменить остальные случаи с помощью простых команд cout <<. Теперь программа перестает отвечать после того, как я набрал принятое целочисленное значение в случае 1. Итак, моя попытка перезагрузки компьютера/переустановки компилятора? – Thomas

+0

Пробная перезагрузка компьютера без везения. Это может быть проблема с компилятором? – Thomas

0

У вас есть:

case '1': 
     { 
     Fugl fugl; fugl.les(); 
     } break; 

При запуске этого вы создаете объект Fug1, а затем вы вызываете функцию les(). Когда вы введете соответствующий возраст в les(), функция вернется. Поскольку break; находится за пределами блока корпуса, он фактически нарушает оператор switch и подходит к концу цикла. Затем он циклически возвращается в начало цикла и снова вводит выбор. Если вы перемещаете разрыв внутри блока корпуса, он работает так, как должен. Это измененный цикл:

do 
    { 
     cout << "Hvilken dyreart ønsker du å registrere? (Q for å avslutte)" 
      << "\n1) - Fugl \n2) - Fisk \n3) - Insekt \n4) - Skalldyr\n"; 
     cin >> valg; 
     switch (valg) 
     { 
     case '1': 
     { 
        Fugl fugl; fugl.les(); 
        break; 
     } 
     case '2': 
     { 
        Fisk fisk; fisk.les(); 
        break; 
     } 
     case '3': 
     { 
        Insekt insekt; insekt.les(); 
        break; 
     } 
     case '4': 
     { 
        Skalldyr skalldyr; skalldyr.les(); 
        break; 
     } 
     case 'Q': return 0; 
     case 'q': return 0; 
     default: cout << "Velg en av ovennevnte!\n"; 
     } 
    } while (valg != 'Q' || valg != 'q'); 
+0

Нет, он не выходит из цикла. – molbdnilo

+0

@molbdnilo: Я отредактировал его, чтобы сказать, что выходит из инструкции switch. Ум и пальцы не синхронизировались. – NathanOliver

+0

Я попытался переместить разрыв в скобках с тем же результатом. – Thomas

Смежные вопросы