Область действия счетчиков - PullRequest
6 голосов
/ 30 августа 2011

В дальнейшем я не знаю, путаю ли я перечисления в C # с C ++, но Я думал, что вы можете получить доступ только к перечислителям в enum, используя Forms::shape, что на самом деле дает ошибку.

int main()
{
    enum Forms {shape, sphere, cylinder, polygon};

    Forms form1 = Forms::shape; // error
    Forms form2 = shape; //  ok
}

Почему к shape разрешен доступ вне enum без оператора области действия и как я могу предотвратить это поведение?

Ответы [ 4 ]

5 голосов
/ 30 августа 2011

Ну, потому что перечисления не образуют декларативную область. Это так же, как в C ++. Вы хотите обернуть эти константы перечисления в выделенную область, создать ее самостоятельно: использовать класс-оболочку или пространство имен.

В будущем стандарте C ++ будет представлен новый тип enum, который создает свою собственную область.

1 голос
/ 30 августа 2011

В вашем примере enum не объявлен внутри класса, поэтому он не имеет конкретной области видимости. Вы можете определить структуру - структура - это класс, в котором все члены являются открытыми в C ++, - который содержит ваше перечисление, и использовать имя этого класса для предоставления области.

Вы также можете создать пространство имен и поместить в него ваше перечисление. Но это может быть излишним.

0 голосов
/ 30 июня 2014

C ++ 11 представляет перечисления в области , которые поддерживают чистоту пространства имен, а также предотвращают непреднамеренные комбинации с типами int.Перечисления с областью видимости объявляются с помощью последовательности ключевых слов enum class.

Используя перечисления с областью действия , приведенный выше пример превращается в следующее:

int main()
{
    enum class Forms {shape, sphere, cylinder, polygon}; // mind the "class" here

    Forms form1 = Forms::shape; // ok
    Forms form2 = shape;  // error
}
0 голосов
/ 30 августа 2011

Я бы предположил, что основная причина проистекает из совместимости с Си.

...