Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
d7d1cd
219 / 149 / 52
Регистрация: 30.06.2011
Сообщений: 1,513
Завершенные тесты: 1
1

Перечисление как параметр функции

23.04.2017, 22:06. Просмотров 1041. Ответов 8
Метки нет (Все метки)

Приветствую всех. Есть перечисление, которое используется как параметр функции. При этом в функцию можно передать такое значение, которого в самом перечислении нет. Почему компилятор не ругает за это?
C++
1
2
3
4
5
6
7
8
enum Numbers { One, Two };
Numbers GetNum(Numbers n) { return n; }
 
Numbers a = GetNum(One); // Все хорошо, вопросов нет
a = GetNum(5); // Тут только предупреждение компилятора
a = GetNum(Numbers(5)); // Тут со стороны компилятора вообще тишина
 
// Как сделать, чтобы функция могла принимать только значения One или Two?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.04.2017, 22:06
Ответы с готовыми решениями:

TBitmap как параметр функции
void ChangeBitmapSize (TBitmap* _btm&, int _newWidth, int _newHeight){ ...

TDateTime как параметр функции
Добрый вечер. Столкнулся с некоторой проблемой. Требуется передать в функцию значение с типом...

Нулевой указатель как параметр функции
Здравствуйте. Помогите, пожалуйста, разъяснить следующую ситуацию. Есть указатель, который пока что...

Функция-член, как параметр функции
Если кратко: - не удается передать указатель на функцию-член как параметр в другую функцию. Можно...

Как передать имя формы как параметр функции
Всем здравствуйте. Почему не срабатывает void WriteSettingToReg(TForm frm) { TRegistry...

8
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28666 / 18966 / 7465
Регистрация: 22.10.2011
Сообщений: 33,121
Записей в блоге: 6
24.04.2017, 09:39 2
Strongly Typed Enums в помощь
1
nick42
Практикантроп
4501 / 2461 / 449
Регистрация: 23.09.2011
Сообщений: 5,293
24.04.2017, 09:42 3
Цитата Сообщение от d7d1cd Посмотреть сообщение
Как сделать, чтобы ...
Вернуться к 5-й версии; мой компилятор такие записи не пропускает__
0
Изображения
Тип файла: gif capture_001.gif (38.0 Кб, 18 просмотров)
d7d1cd
219 / 149 / 52
Регистрация: 30.06.2011
Сообщений: 1,513
Завершенные тесты: 1
24.04.2017, 13:31  [ТС] 4
volvo, из информации по ссылке, данной вами, понял так, что надо к enum добавить class. Сделал это, однако нужного эффекта это не возымело. Единственное, члены перечисления перестали быть видимыми напрямую. К ним надо обращаться через имя перечисления.
0
24.04.2017, 13:31
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28666 / 18966 / 7465
Регистрация: 22.10.2011
Сообщений: 33,121
Записей в блоге: 6
24.04.2017, 14:02 5
d7d1cd, стоп. Каково ожидаемое тобой поведение компилятора? Ты хочешь, чтобы при попытке Numbers(5) происходило что?

Цитата Сообщение от d7d1cd Посмотреть сообщение
При этом в функцию можно передать такое значение, которого в самом перечислении нет. Почему компилятор не ругает за это?
Потому что Стандарт С++ этого не запрещает. И только в случае, если переданное значение не помещается в underlying type перечисления - это будет UB. Если же оно помещается (а 5-ка помещается однозначно) - то это просто
the resulting enumeration value is unspecified
0
Dinkin
24.04.2017, 14:12
  #6

Не по теме:


Цитата Сообщение от nick42 Посмотреть сообщение
Вернуться к 5-й версии; мой компилятор такие записи не пропускает
Шел 2137 год, embarcadero выпустила, новую версию "XE Юпитер"...но cтарый добрый BCB5 все еще стоял у меня на компе :D

0
d7d1cd
219 / 149 / 52
Регистрация: 30.06.2011
Сообщений: 1,513
Завершенные тесты: 1
24.04.2017, 14:24  [ТС] 7
volvo, мне надо сделать так, чтобы в качестве параметра функции можно было указать только определенные значения (например, только определенные перечисления). Функция может работать в нескольких режимах. Надо иметь возможность задавать эти режимы, но только определенные заранее. Задание не определенных режимов должно вызвать ошибку компиляции. Но видимо я много хочу. Получается, надо в функции проверять какой режим задали?
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
28666 / 18966 / 7465
Регистрация: 22.10.2011
Сообщений: 33,121
Записей в блоге: 6
24.04.2017, 14:36 8
мой компилятор такие записи не пропускает
Причем, судя по сообщениям об ошибках, он вообще не знает, что такое enum...

Получается, надо в функции проверять какой режим задали?
Лучше всего.
1
d7d1cd
219 / 149 / 52
Регистрация: 30.06.2011
Сообщений: 1,513
Завершенные тесты: 1
24.04.2017, 15:06  [ТС] 9
Ясно. А то засело в голове, что для указания параметра функции можно применить подобие комбобокса, то есть выбор значения из заданных и ничего больше.
Разрешите тогда еще вопрос, связанный с перечислениями. Режим функции будет задаваемый перечислением. В функции это значение перечисления будет проверяться на допустимость. Далее, в соответствии режимом, необходимо использовать определенную константу. Как это лучше всего осуществить? Пока планирую использовать значение перечисления в качестве индекса массива, хранящего необходимые константы.
0
24.04.2017, 15:06
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.04.2017, 15:06

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

Параметр функции отображается неверно
Здравствуйте! Помогите, замучался с преобразованием строки. Вот код void __fastcall...

Не могу преобразовать параметр функции VirtualAlloc
Добрый день. Уважаемые форумчане, прошу Вашей помощи. На экранной форме есть Edit в котором...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.