Как язык Java помешал нам от подкласса «Enum», когда он объявлен как абстрактный? [Дубликат]

Отсутствует «extern» в объявлениях / определениях переменной const (только для C ++)

Для людей, прибывающих с C, может показаться неожиданным, что в C ++ глобальные переменные const имеют внутренние (или статические) связь. В C это не так, поскольку все глобальные переменные неявно extern (т.е. когда отсутствует ключевое слово static).

Пример:

// file1.cpp
const int test = 5;    // in C++ same as "static const int test = 5"
int test2 = 5;

// file2.cpp
extern const int test;
extern int test2;

void foo()
{
 int x = test;   // linker error in C++ , no error in C
 int y = test2;  // no problem
}

correct would использовать файл заголовка и включить его в file2.cpp и file1.cpp

extern const int test;
extern int test2;

. В качестве альтернативы можно было бы объявить переменную const в файле file1.cpp с явным extern

4
задан GOTO 0 6 September 2013 в 06:33
поделиться

1 ответ

Неправильно распространять Enum непосредственно в пределах языка . Каждый раз, когда вы объявляете enum, делает создание подкласса Enum.

Способ JLS запрещает вам «вручную» объявлять класс, который расширяет Enum просто запретить это явно. Из JLS-раздел 8.1.4 :

Это ошибка времени компиляции, если ClassType называет класс Enum или любой его вызов.

(Где ClassType - тип, который вы расширяете.)

Без этого правила ваш код был бы совершенно прав.

6
ответ дан Jon Skeet 28 August 2018 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: