Переключение между значениями перечисления: C ++ - PullRequest
0 голосов
/ 14 апреля 2011

Надеюсь, это будет простой вопрос. Я не особо разбирался с перечислениями, поэтому не до конца понимаю, как они работают. В моей программе я пытаюсь сохранить работу игрока в перечислении. Мне нужна функциональность, чтобы работа могла быть изменена. Я пытаюсь использовать оператор switch, но он не меняет работу игрока.

Код:

// if change is True, change the job. If false, simply return the current value
int GameModeState::changeJob(bool change)
{
    int job = Landman; // Default job is landman
    if (change == true)
    {
        switch(job)
        {
        case Landman:
            return job;
            break;
        case Geologist:
            return job;
            break;
        default:
            job = Landman;
            return job;
            break;
        }
    } 
    else 
    {
        return job;
    }
}

// when the player opens the stat sheet, it should change their job
void GameModeState::_statsheet()
 {
     changeJob(true);
 }

Что я делаю не так, чтобы сменить работу? Я думаю, что проблема в выражении switch.

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Ваша логика неверна. Заявление switch(job) приводит вас к вашему заявлению по делу. В

case Landman

Вы немедленно возвращаете Landman (поскольку вы задали для Landman задание до выполнения оператора switch, он ВСЕГДА возвратит Landman так, как вы его закодировали), что полностью возвращает вас из этой функции. Он никогда не пытается сменить работу на ДРУГОЙ. Обратите внимание, что ваши операторы break также никогда не выполняются, так как return немедленно возвращает вас из этого вызова функции. Вы, вероятно, хотите это:

case Landman:
   job = geologist;
   return job;

И так далее, и тому подобное. Кроме того, вы жестко программируете случай задания по умолчанию для Landman. Возможно, вы захотите либо передать как переменную, либо прочитать из объекта значение CURRENT Job на листе игрока, а затем скорректировать его в соответствии с его текущим значением.

0 голосов
/ 14 апреля 2011

С оператором switch все в порядке.У вас есть куча бесполезных операторов прерывания, но они не вызывают проблем (за исключением того, что код становится менее читабельным).

Это проблема:

// if change is True, change the job. If false, simply return the current value

job являетсялокальная переменная, единственный эффект установки ее - это более поздний оператор return job;.Ваш комментарий должен выглядеть следующим образом:

// if change is true, return the new job. If false, simply return the current value

Новое значение job IS возвращено, но вы отбрасываете возвращаемое значение.

Конечно, вы всегда устанавливаете job = Landman, чтоозначает, что вы всегда выбираете один и тот же путь через switch.Вся функция эквивалентна return Landman;.

...