Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> О приведении типов 
:(
    Опции темы
hoz
Дата 22.9.2014, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



 Встретилась вот такая вот ситуация:
Код

ENUM_ORDER_TYPE type =(ENUM_ORDER_TYPE) HistoryOrderGetInteger(ticket,ORDER_TYPE);

Возник вопрос. В С++ такое разве применяется? Имею ввиду приведение типа другого порядке к другому.
Суть в том, что функция HistoryOrderGetInteger(ticket,ORDER_TYPE) возвращает тип long. А судя по этой строке, здесь long приводится к ENUM ? По-моему это не корректно..
PM MAIL   Вверх
baldina
Дата 22.9.2014, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



это приведение в стиле C, применяется. конечно, такое приведение - потенциальный источник ошибок.
более современный способ - static_cast, но в данном случае лучше не станет.
PM MAIL   Вверх
math64
Дата 22.9.2014, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 12
Всего: 72



А что тут некорректного? enum - это фактически целое число, только может принимать конкретные значения.
PM   Вверх
hoz
Дата 22.9.2014, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 27.6.2013

Репутация: нет
Всего: нет



Цитата(math64 @  22.9.2014,  14:08 Найти цитируемый пост)
А что тут некорректного? enum - это фактически целое число, только может принимать конкретные значения. 

Кто такое сказал? ENUM - это перечисление. А перечисление может быть любого типа...
PM MAIL   Вверх
borisbn
Дата 22.9.2014, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
 перечисление может быть любого типа... 

Кто такое сказал?


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
NoviceF
Дата 22.9.2014, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Цитата(hoz @  22.9.2014,  15:58 Найти цитируемый пост)
А перечисление может быть любого типа... 

Возможно не в c++.  В c++ перечесление - это целочисленные константы времени компиляции.
PM MAIL   Вверх
baldina
Дата 22.9.2014, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
перечисление может быть любого типа...

перечисление типа не имеет (оно само есть тип), но неявно приводится к целочисленным. обратное преобразование должно быть явным. в с++11 появились строго типизированные enum class, которые неявно не приводятся, и можно указать размер (конкретный целочисленный тип).
были предложения расширить на double, но не вошло.

кстати можно устроить специфическое перечисление времени компиляции без возможности даже явного приведения к целым, что используется например в категориях итераторов stl, упрощенно вроде
Код

struct iterator_tag {};
struct input_iterator_tag : iterator_tag {};
struct forward_iterator_tag : input_iterator_tag {};
struct bidirectional_iterator_tag : forward_iterator_tag {};
struct random_iterator_tag : bidirectional_iterator_tag {};
struct output_iterator_tag : iterator_tag {};
// ...
template <typename Iterator>
void reverse_impl (Iterator begin, Iterator end, forward_iterator_tag) {...}
template <typename Iterator>
void reverse_impl (Iterator begin, Iterator end, random_iterator_tag) {...}

template <typename Iterator>
void reverse (Iterator begin, Iterator end) {
  reverse_impl (begin, end, iterator_category(begin));
}


Это сообщение отредактировал(а) baldina - 22.9.2014, 17:36
PM MAIL   Вверх
Lukkoye
Дата 29.9.2014, 00:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 86
Регистрация: 23.3.2013

Репутация: нет
Всего: 1



Цитата(hoz @  22.9.2014,  14:58 Найти цитируемый пост)
Кто такое сказал? ENUM - это перечисление. А перечисление может быть любого типа... 


Не может. енум - синтаксический сахар над int, значения которого известно времени компиляции.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.