|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Непонятка при присвоении значения переменной, имеющей тип: перечисление. |
|
C/C++ - [решено] Непонятка при присвоении значения переменной, имеющей тип: перечисление.
|
![]() Ветеран Сообщения: 1328 |
Начал изучать язык C++, и дойдя до перечислений столкнулся с непонятной для себя ситуацией при присвоении значения переменной, имеющей тип: перечисление. Как я понимаю, перечисления нужны для создания новых типов переменных, для которых четко задано то множество значений, которое им можно присваивать. Ниже я приведу факты, которые не укладываются в мое представление. Например, возьмем следующий код:
, который создает новый тип-перечисление COLOR и задает для него пять возможных значений. Теперь по идее, если создать переменную с типом COLOR, ей можно будет присвоить только одно из этих пяти значений, а попытка присвоить какое-либо отличное значение должно привести к ошибке. Верно я понимаю? Идем дальше: каждой константе перечисления соответствует определенное целочисленное значение. Например: test_1 - 0 test_2 - 1 test_3 - 2 test_4 - 3 test_5 - 4 Таким образом, по идее, если я создам переменную с типом COLOR: , то в последствии смогу присвоить ей лишь те значения, которые указывались при описании перечисления. Например так: , или так: Никаких проблем при этом, как и следовало ожидать, не возникает. Непонятка возникает в том случае, если присвоить переменной vartest значение, которое не было указано при описании перечисления COLOR. Дело в том, что компилятор не считает такой код ошибочным (при компиляции нет ни ошибок, ни предупреждений), и действительно в процессе работы программы переменной vartest присваивается левое значение... Например: Мне хотелось бы знать: это я не правильно понимаю суть работы с перечислениями, или компилятор (Visual C++ 6.0)? Почему компилятор не пресекает подобные действия? |
|
------- Отправлено: 11:08, 01-12-2008 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
|
|
Отправлено: 11:58, 01-12-2008 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать pva
Цитата pva:
1) Я им пользовался в своем примере в первом посте; 2) С помощью static_cast. Например: В обоих случаях имеет место обсуждаемая непонятка. Цитата pva:
P.S: Неужели придется писать свой код, контролирующий корректность значения int перед его преобразованием в enum? Хотелось бы этого избежать... P.S.S: По ходу изучения работы с перечислениями я столкнулся с еще одной непоняткой. Проблема в том, что компилятор не дает мне при создании нескольких разных типов-перечислений использовать в качестве одного из их возможных значений одноименную константу. Сразу скажу, что технически я понимаю почему это происходит. Мне не понятно: почему так сделали? Зачем сделали возможные значения перечислений доступными коду как обычные константы? |
||
------- Отправлено: 13:21, 03-12-2008 | #3 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Цитата Oleg_SK:
Цитата Oleg_SK:
enum ColumnAlign { left, right, center }; enum RectField { left, right, bottom, top }; void Column::setAlign(ColumnAlign); void MyRect::getField(RectField); void MyLink::attach(ColumnAlign, RectField); Цитата Oleg_SK:
|
|||
Отправлено: 15:16, 03-12-2008 | #4 |
![]() Ветеран Сообщения: 1328
|
Профиль | Отправить PM | Цитировать |
|
------- Отправлено: 19:27, 03-12-2008 | #5 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Меня в enum смущает только одно:
class ListView { public: enum column_align_t {ca_left, ca_right, ca_center}; ... }; // правильно так: listView1.setColumnAlign(1, ListView::ca_left); // но логичней так: // listView1.setColumnAlign(1, ListView::column_align_t::ca_left); не забываем помечать решённую тему ;-) |
Отправлено: 07:22, 04-12-2008 | #6 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Реализация функций длины переменной, выделение подстроки с параметрами в переменной. | NiOl | Скриптовые языки администрирования Windows | 7 | 31-01-2019 19:58 | |
MySQL - Хранение значения переменной в MySQL-базе | ManHack | Программирование и базы данных | 7 | 11-07-2009 10:02 | |
VBS/WSH/JS - [решено] Stop цикл при обнаружении нужного значения из файла | Afon | Скриптовые языки администрирования Windows | 4 | 26-01-2009 15:16 | |
VBS/WHS/JS - Вывод значения переменной в сообщение | la_vanille_ciel | Программирование и базы данных | 3 | 09-04-2008 11:55 | |
php деление значения строковой переменной | Guest | Вебмастеру | 4 | 14-10-2004 17:12 |
|