Как использовать значение Enum из класса в другой части кода? - PullRequest
35 голосов
/ 22 декабря 2010

Исходя из опыта C # ночного курса в местном колледже, я начал свой путь в C ++. У меня много боли, привыкнуть к синтаксису. Я также все еще очень зеленый, когда дело доходит до методов кодирования.

Из моей функции WinMain я хочу получить доступ к переменной, которая использует перечисление, которое я объявил в другом классе.

(inside core.h)
class Core
{
    public:
    enum GAME_MODE
    {
        INIT,
        MENUS,
        GAMEPLAY
    };
    GAME_MODE gameMode;

    Core();
    ~Core();
    ...OtherFunctions();
};

(inside main.cpp)
Core core;
int WINAPI WinMain(...)
{
    ... startup code here...

    core.gameMode = Core.GAME_MODE.INIT;

    ...etc...
}

По сути, я хочу установить для этого gameMode значение enum равное Init или что-то подобное из моей функции WinMain. Я хочу также иметь возможность читать его из других областей.

Я получаю ошибку ...

expected primary-expression before '.' token

Если я пытаюсь использовать core.gameMode = Core::GAME_MODE.INIT;, то получаю ту же ошибку.

Меня не смущают лучшие практики, так как я просто пытаюсь получить общее представление о передаче переменных в C ++ между файлами. Я позабочусь о том, чтобы переменные были защищены и аккуратно спрятаны позже, как только я привыкну к гибкости синтаксиса.

Если я правильно помню, C # позволил мне использовать Enums из других классов, и все, что мне нужно было сделать, это что-то вроде Core.ENUMNAME.ENUMVALUE.

Я надеюсь, что то, что я хочу сделать, ясно: \ Поскольку я понятия не имею, что такое правильная терминология.

1 Ответ

45 голосов
/ 22 декабря 2010

Используйте

core.gameMode = Core::INIT;

Отдельные значения перечисления находятся не в пределах этого перечисления, а на том же уровне, что и само перечисление. Это то, что большинство других языков (включая C #) делают по-разному, и C ++ 0x допускает оба варианта, так что

core.gameMode = Core::GAME_MODE::INIT;

также будет легальным.

Кроме того, строго типизированные перечисления, которые будут добавлены в C ++ 0x (enum class), будут помещать значения enum only в область действия enum (т.е. как в C #); это решает проблему, которую вы отметили в своем комментарии, что для «нормальных» перечислений идентификаторы для значений перечислений должны быть уникальными для всех перечислений, определенных в той же области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...