Как мы делаем конструктор enum в цели c
В Java мы можем легко сделать следующее перечисление
public enum Food {
HAMBURGER(7), FRIES(2), HOTDOG(3), ARTICHOKE(4);
Food(int price) {
this.price = price;
}
private final int price;
public int getPrice() {
return price;
}
}
Но я хотел бы сделать то же самое перечисление, но, насколько я читал, я не мог найти никакого способа сделать конструктор в цели C, как мы делаем в Java.
Как добиться того же в цели c?
1 ответ
(Объектив-)C перечисления очень просты.
Они не являются типом, определенным набором литералов, например, как в Аде или Паскале, хотя они могут показаться; они также не помечены как непересекающиеся объединения, например, как в Swift или Java.
Вместо этого они являются просто набором констант, обычно int
тип, хотя это может быть изменено на другие целочисленные типы, которые могут использоваться более или менее взаимозаменяемо как int
(или любой другой целочисленный тип).
Однако, если ваше перечисление такое же, как описано выше, вы можете достичь чего-то похожего с перечислением стиля C:
typedef enum
{
HAMBURGER = 7,
FRIES = 2,
HOTDOG = 3,
ARTICHOKE = 4
} Food;
Это дает вам тип, Food
с четырьмя буквальными значениями, HAMBURGER
и др.; и назначение, равенство, switch
заявления и т. д. все работают как положено. Например:
Food item = HOTDOG;
if (item == FRIES) ...
switch (item) { case ARTICHOKE: ...
Вы также можете использовать литералы как целые числа, чтобы получить "цену", например
int itemPrice = (int)item;
В базовом типе нескольким литералам может быть присвоено одно и то же значение, поэтому у вас могут быть разные элементы с одинаковой ценой.
Учитывая это, вы можете достичь чего-то похожего на ваш Java-код без какого-либо кодирования, кроме объявления enum
, Однако, если вы используете все возможности перечислений Java, вам придется определить свои собственные class
/struct
и методы / функции для реализации необходимых вам функций.
НТН