Можно ли перегрузить оператор инкремента для enum?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Можно ли перегрузить оператор инкремента для enum?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Оператор инкремента/декремента работает лишь с переменными, а enum (перечислитель) является набором констант. Если же написать некий собственный класс, в котором перегруженные операторы инкремента/декремента будут выполнять функции навигатора списка и возвращать соответствующие константы перечислителя, то это вполне реализуемо.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

enum TPosition {NoPosition=0, Left=1, Top=2, FirstRight=3, SecondRight=4, LeftBottom=5, Bottom=6, RightBottom=7};
TPosition Position=Left;
Position=Top; // Здесь происходит присваивание, что с констами не совместимо.
Или подразумевается не возможность ввести с потока? Так иттераторы тоже с потока не вводятся. И за какой это решёткой родился загадочный возврат константы? Константа - она на то и константа, что она просто есть и для неё не нужны функции и операторы, а

Код: Выделить всё

return 14;
- нифига не генератор чисел, тем более случайных.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Несколько раз перечитал последний пост, но так и не смог его понять. Если переформулируешь, то попробую ответить.

Единственное, что мне понятно, это вот этот комент.
Position=Top; // Здесь происходит присваивание, что с констами не совместимо.
И я скажу, что всё здесь в порядке. Константа стоит справа, а Position - это не константа, а переменная типа TPosition. Эта переменная без проблем может меняться в ходе выполнения программы.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):Константа стоит справа, а Position - это не константа, а переменная типа TPosition. Эта переменная без проблем может меняться в ходе выполнения программы.
Вот именно. А тип у неё какой?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я же написал. Внимательнее прочти. У переменной Position тип TPosition.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

А что такое в данном случае TPosition?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

TPosition - это тип, который является enum'ом.

Его элементы (Left, Top и т.д.) являются константами.

Postion является переменной типа TPosition. Изначально она инициализируется константой Left, затем меняет своё значение на Top.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

В принципе enum - это обычный unsigned int, просто с возможностью именования и проверкой компилятором, диапазонов
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а):TPosition - это тип, который является enum'ом.
Вот именно. Но почему то этот тип "набора констант" имеет переменная. На смом деле набор констант - это константный массив, например,

Код: Выделить всё

const a:array [1..8] of TColor=(clRed, clGreen, clBlue, clBlack, clWhite, clGray, clYellow, clAqua);
. Мне же нужен упорядоченный перечисляемый тип, переменные которого во-первых могут в цикле последовательно принимать ряд значений, так чтоб значение переменной на каждом шагу цикла было следующим, или, наоборот, предыдущим значением этого ряда, для чего нужны инкремент и декремент, а во-вторых чтоб значения этого типа можно было ешё и сравнивать всеми операторами сравнения, определяя в результате сравнения, в каком порядке всё в том же ряду стоят значения двух переменных. Причём, я хочу, чтоб порядок не был связан со значениями кодов. Например,

Код: Выделить всё

enum TPosition {NoPosition=0, Left=1, Top=2, FirstRight=3, SecondRight=4, LeftBottom=5, Bottom=6, RightBottom=7};
, но порядок: Left<FirstRight<SeconRight<Top<LeftBottm<Bottom<RightBottom и если перебор только что завершён, то следующий инкремент/декремент чтоб давал NoPosition, не меньшее и не большее остальных, но и не равное им, это значение должно быть вне порядка.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить