Почему я могу установить анонимное перечисление равное другому в C, но не в C ++?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

26
задан samoz 18 March 2010 в 23:40
поделиться

3 ответа

Преобразование из одного перечисляемого типа в другой происходит через целочисленный тип (возможно, базовый тип источника, не уверен).

Неявное преобразование перечисления в целочисленный тип разрешено как в C, так и в C ++. Неявное преобразование целочисленного типа в enum разрешено в C, но не в C ++.

По сути, C ++ более безопасен по типу. Он пытается помешать вам делать это:

enum {zero, one, two} x;

x = 143; // assigns a value outside the range of the enum

Если вы хотите выполнить преобразование enum-enum в C ++, вы можете использовать typeof / declspec / boost typeof или эквивалент. В GCC:

int main() {
    enum {zero, one, two} x;
    enum {zero1, one1, two1} y = two1;
    typedef typeof(x) xtype;
    x = static_cast<typeof(x)>(y);
}

Однако обычно это не имеет смысла. Для большинства целей перечисления (особенно анонимные) являются «перечислимыми типами». Они просто «реализованы» стандартами C и C ++ как целые числа в забавных шляпах, но это не значит, что красный «равно» молоток только потому, что они каждый появляется первым в двух разных перечислениях (цвета и инструменты соответственно). static_cast предполагает, что существует связь между двумя задействованными типами. Любые два перечислимых типа «связаны» тем, что оба имеют базовый целочисленный тип, и они связаны, так что «отношение» там на самом деле мало что говорит. Если вы напишете этот код, вы получите довольно плохую версию безопасности типов.

34
ответ дан 28 November 2019 в 07:36
поделиться

Я предполагаю, что это связано с более строгим набором текста в C ++.

В C x = 5; также компилируется. В C ++ этого не произойдет, потому что преобразование типов не определено. По этой же причине x = y не компилируется.

Вы можете посмотреть этот пример на кодовой панели , который дает более подробное описание ошибки, чем ваш компилятор.

1
ответ дан 28 November 2019 в 07:36
поделиться

Компилятор не знает, как неявно преобразовать один перечисляемый тип данных в другой.

Попробуйте следующее.

enum typeX { one } x;
enum typeY { two } y;
x = (typeX) y;
0
ответ дан 28 November 2019 в 07:36
поделиться