Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/37: Рейтинг темы: голосов - 37, средняя оценка - 4.86
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
1

Какой смысл несет именованный enum?

31.08.2011, 10:35. Показов 7520. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Собственно зачем объявлять enum таким образом:
C++
1
2
3
4
5
6
7
enum suit
{
     DIAMONDS,
     HEARTS,
     SPADES,
     CLUBS
}
suit s1, s2;

когда можно просто:
C++
1
2
3
4
5
6
7
enum
{
     DIAMONDS,
     HEARTS,
     SPADES,
     CLUBS
}
Ведь enum просто создает константы целого типа с определенными значениями ( в данном случае: 0,1,2,3). Зачем создавать s1,s2,... ?

Добавлено через 12 минут
Всё понял, практически никакого смысла. Единственно только предупреждение компилятор выдаст при попытке в объект s1 типа suit записать целое значение, а не одну из перечисленных констант. Вообщем, делает код трудночитаемым и практически никакой пользы.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
enum suit
{
        DIAMONDS,
        HEARTS,
        SPADES,
        CLUBS
};
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        suit s1;
        s1 = 2;
        ShowMessage(s1);
}
2
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2011, 10:35
Ответы с готовыми решениями:

Смысл запрета на объявление enum в не static классах?
Есть не static класс, у меня он называется ParsingPart. Экземпляры этого класса пока могут быть...

Красный свет светофора горит 40 секунд, зелёный - 20, какой объём информации несёт каждый из них
Красный свет светофора горит 40 секунд, зелёный - 20, какой объём информации несёт каждый из них

Почему ДВССЫЛ на простой именованный диапазон работает, а на динамический именованный не работает?
Т.е. если создать список, который будет получать данные из именованного диапазона с фиксированным...

Enum AttributeTargets какой-то особенный?
Привет! Если написать выражение (AttributeTargets.Class | AttributeTargets.Method), то в...

9
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
31.08.2011, 10:51 2
Затем что бы применении шире было
пример
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum PrintType
{
   PT_STDOUT,
   PT_TEMPFILE
}
 
enum ShowStyle
{
  SS_TABLE,
  SS_LIST
}
 
void print(PrintType type,...);
void Show(ShowStyle style,struct _data data);
Что бы логическое разграничение между ними было, а не просто константы
0
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
31.08.2011, 11:27  [ТС] 3
Возможно пока не привык ещё, поэтому такая неприязнь к именованному enum.
По мне так проще воспринимать так:
C++
1
void print(int type,...);
потому как уже сразу понятно, что переменная type имеет тип int.

а так
C++
1
void print(PrintType type,...);
придется вспоминать, что из себя представляет PrintType либо нажимать Find Declaration.
если читать эту строку, то читается она так:
в функцию print передается переменная type типа PrintType, но если посмотреть этот PrintType, то это будет перечисление, а не какой-то тип. не ассоциируется у меня PrintType как тип.
0
365 / 247 / 24
Регистрация: 03.04.2011
Сообщений: 558
Записей в блоге: 1
31.08.2011, 12:53 4
Цитата Сообщение от kzru_hunter Посмотреть сообщение
void print(int type,...);
Мне тоже такой вариант больше нравится, но используя enum можно более информативнее описать значение данной переменной
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
31.08.2011, 23:28 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от kzru_hunter Посмотреть сообщение
Зачем создавать s1,s2
Чтобы различать константы, которые одинаково называются - это РАЗ!

C++
1
2
3
enum TBorderStyle { bsNone };
enum TButtonState { bsNone };
enum TBoundStyle { bsNone };
Чтобы передавать их как параметры и делать свой код более читабельным для себя и других - это ДВА.

Цитата Сообщение от kzru_hunter Посмотреть сообщение
не ассоциируется у меня PrintType как тип.
Добавь впереди букву T и будет ассоциироваться.

И вообще желательно придерживаться коддинг-стандарта в той среде, в которой программируешь (или в фирме),
если в Билдере,
то enum начинается с T, далее описание - каждое слово без разделителей, последнее слово - в единственном числе, множество на основе этого enum - повторяет название enum + последнее слово во множественном числе.
Название каждого элемента в enum - это аббревиатура больших букв в названии

C++
1
2
3
4
5
enum TFontStyle { fsBold, fsItalic, fsUnderLine, fsStrikeOut};
typedef Set <TFontStyle,fsBold,fsStrikeOut> TFontStyles;
 
enum TMyEnumType {metFirst, metSecond, metThird};
typedef Set <TMyEnumType,metFirst,metThird> TMyEnumTypes;
У нас на фирме, например, очень жёстко придерживаются стандарта, потому что твой код могут читать другие люди и разбираться в твоём int Type, особенно когда их сотни, никто не будет.

Вот два кода для сравнения:
Как из этого кода понять, что с формой происходит ... ?
C++
1
2
3
4
5
6
7
TForm *AForm = new TForm(Application);
AForm->Position = 1;
AForm->FormStyle = 2;
AForm->BorderState = 5;
AForm->WindowState = 0;
AForm->Font->Style = 2;
// ... ну и так дальше
А здесь только глянул код - и всё понятно
C++
1
2
3
4
5
6
7
TForm *AForm = new TForm(Application);
AForm->Position = poDesigned;
AForm->FormStyle = fsStayOnTop;
AForm->BorderState = bsDialog;
AForm->WindowState = wsMaximized;
AForm->Font->Style = fsItalic;
// ... ну и так дальше
Добавлено через 5 минут
Кстати чего далеко ходить

Цитата Сообщение от kzru_hunter Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
enum suit
{
 DIAMONDS,
 HEARTS,
 SPADES,
 CLUBS
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
 : TForm(Owner)
{
 suit s1;
 s1 = 2;
 ShowMessage(s1);
}
C++
1
2
3
4
5
6
7
8
9
enum TSuitType {
        stDiamonds, stHearts, stSpades, stClubs
};
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) {
        TSuitType ASuitType = stDiamonds;
        ShowMessage(ASuitType);
}
Добавлено через 6 минут
Ах, да и, совсем забыл, в Билдере можно получать текстовое значение enum, что очень удобно при сохранении в различные конфиги, а также при разработке различных скриптов.
4
1123 / 794 / 101
Регистрация: 01.02.2011
Сообщений: 1,878
Записей в блоге: 1
01.09.2011, 11:42  [ТС] 6
Цитата Сообщение от Maluda Посмотреть сообщение
Чтобы различать константы, которые одинаково называются - это РАЗ!
пробовал создавать константы с одинаковыми именами - билдер ругается.
Цитата Сообщение от Maluda Посмотреть сообщение
Чтобы передавать их как параметры и делать свой код более читабельным для себя и других - это ДВА.
это можно сделать и c неименованным enum.
все примеры ниже можно применить и к неименованному enum.
C++
1
2
3
4
5
6
7
enum {poDesigned, fsStayOnTop, bsDialog, wsMaximized, fsItalic};
TForm *AForm = new TForm(Application);
AForm->Position = poDesigned;
AForm->FormStyle = fsStayOnTop;
AForm->BorderState = bsDialog;
AForm->WindowState = wsMaximized;
AForm->Font->Style = fsItalic;
C++
1
2
3
4
5
6
7
enum { stDiamonds, stHearts, stSpades, stClubs };
 
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner) {
        int ASuitType = stDiamonds;
        ShowMessage(ASuitType);
}
C++
1
2
enum { fsBold, fsItalic, fsUnderLine, fsStrikeOut};
typedef Set <int,fsBold,fsStrikeOut> TFontStyles;
1
LK
Заблокирован
01.09.2011, 17:36 7
давайте исходить из этого: если enum присутствует - это намного лучше, чем было бы наличие его отсутствия , а пить-не пить - дело вкуса .
0
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
14.01.2013, 19:22 8
Цитата Сообщение от kzru_hunter Посмотреть сообщение
это можно сделать и c неименованным enum.
Это делается для удобства, ещё раз повторю

C++
1
2
3
4
5
6
7
enum TSuitType {
        stDiamonds, stHearts, stSpades, stClubs
};
 
void GetSuit(const TSuitType &ASuitType) {
    // some actions with TSuitType
}
kzru_hunter предлагает писать просто вот так
C++
1
2
3
4
5
6
7
enum {
        stDiamonds, stHearts, stSpades, stClubs
};
 
void GetSuit(const unsigned int &ASuitType) {
    
}
Но ИМХО гораздо удобнее передавать enum в качестве параметра.
Интуитивно понятнее, гораздо проще разобраться для того, кто будет использовать твой код.
Также компилятор предупредит, если будет передан не enum, autocomplete будет предлагать enum,
если в параметре функции он прописан, ну и т.д.
2
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
14.01.2013, 19:34 9
Цитата Сообщение от kzru_hunter Посмотреть сообщение
По мне так проще воспринимать так:
C++
1
void print(int type,...);
И что тут простого ? А главное что хорошего ? Магические цифры ? Или сишный #define ? или то что пользователь может задать 999 и потом искать эту ошибку долго и нудно?

Ставить int там где должен быть enum очень плохой тон...
1
1280 / 598 / 116
Регистрация: 18.08.2009
Сообщений: 832
14.01.2013, 19:35 10
C++
1
2
3
4
5
void GetSuit(const TSuitType &ASuitType);
 
GetSuit(stDiamonds);  // компилятор пропустит
 
GetSuit(0);               // компилятор выдаст предупреждение
1
14.01.2013, 19:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2013, 19:35
Помогаю со студенческими работами здесь

Именованный не именованный каналы
Есть програмулина, как её через каналы пустить?? клиенская часть #include &lt;stdio.h&gt;...

Какой смысл тега footer?
Добрый день! Пробовал установить footer. У него такие же свойства, как я понял, как и у div....

Какой смысл синхронизации в многопоточности ?
Зачем нужно синхронизировать переменные(ресурсы) или методы если они итак портят принцип...

Какой смысл от подобного размещения?
http://dir.ruip.net/start.62.3.2.htm ссылка на мой не активна - ни в первом, ни во втором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru