Страница 1 из 5
Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 10:36
Сионист
Можно ли перегрузить оператор инкремента для enum?
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 11:31
WinMain
Оператор инкремента/декремента работает лишь с переменными, а enum (перечислитель) является набором констант. Если же написать некий собственный класс, в котором перегруженные операторы инкремента/декремента будут выполнять функции навигатора списка и возвращать соответствующие константы перечислителя, то это вполне реализуемо.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 13:52
Сионист
enum TPosition {NoPosition=0, Left=1, Top=2, FirstRight=3, SecondRight=4, LeftBottom=5, Bottom=6, RightBottom=7};
TPosition Position=Left;
Position=Top; // Здесь происходит присваивание, что с констами не совместимо.
Или подразумевается не возможность ввести с потока? Так иттераторы тоже с потока не вводятся. И за какой это решёткой родился загадочный возврат константы? Константа - она на то и константа, что она просто есть и для неё не нужны функции и операторы, а
- нифига не генератор чис
ел, тем более случайных.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 19:09
Romeo
Несколько раз перечитал последний пост, но так и не смог его понять. Если переформулируешь, то попробую ответить.
Единственное, что мне понятно, это вот этот комент.
Position=Top; // Здесь происходит присваивание, что с констами не совместимо.
И я скажу, что всё здесь в порядке. Константа стоит справа, а Position - это не константа, а переменная типа TPosition. Эта переменная без проблем может меняться в ходе выполнения программы.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 19:15
Сионист
Romeo писал(а):Константа стоит справа, а Position - это не константа, а переменная типа TPosition. Эта переменная без проблем может меняться в ходе выполнения программы.
Вот именно. А тип у неё какой?
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 19:30
Romeo
Я же написал. Внимательнее прочти. У переменной Position тип TPosition.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 20:06
Сионист
А что такое в данном случае TPosition?
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 20:23
Romeo
TPosition - это тип, который является enum'ом.
Его элементы (Left, Top и т.д.) являются константами.
Postion является переменной типа TPosition. Изначально она инициализируется константой Left, затем меняет своё значение на Top.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 03 апр 2014, 22:56
somewhere
В принципе enum - это обычный unsigned int, просто с возможностью именования и проверкой компилятором, диапазонов
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 07:32
Сионист
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, не меньшее и не большее остальных, но и не равное им, это значение должно быть вне порядка.