Страница 2 из 5
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:01
Romeo
Нет, enum и массив констант - это абсолютно разные вещи. Enum - это, по сути, рестрикшен целочисленного типа, как верно заметил somewhere. Список же его элементов - это не набор элементов, расположенных в пямяти (как в случае массива), а набор возможных значений, которая может принять переменная типа нашего enam'а, которая, фактически, является переменной целочисленного типа.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:13
Сионист
Вот именно.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:40
Decoder
Я чувствую, что проще самому написать конкретный пример, чем продолжать без конца этот разговор.
WinMain ведь дал уже подсказку как это реализовать.
Это собственно само объявление перечислителя...
Код: Выделить всё
typedef enum _ListOfDays
{
Monday = 1,
Tuesday = 2,
Wednesday = 4,
Thursday = 8,
Friday = 16,
Saturday = 32,
Sunday = 64
} ListOfDays;
Теперь нужно создать массив из его элементов...
Код: Выделить всё
ListOfDays days[] =
{
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
Теперь нужно создать класс, в котором операторы инкремента/декремента будут изменять индекс массива и возвращать соответствующие элементы...
Код: Выделить всё
class DayList
{
public:
DayList() : m_index(0)
{
}
operator ListOfDays()
{
// текущее значение
return days[m_index];
}
ListOfDays operator++()
{
// TODO: проверить индекс!
return days[++m_index];
}
ListOfDays operator--()
{
// TODO: проверить индекс!
return days[--m_index];
}
private:
unsigned m_index;
};
Остаётся дописать лишь проверку корректности индекса, чтобы не выходить за границы массива.
И всё. Используй класс DayList в качестве управляемого енумератора.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:53
Сионист
Decoder писал(а):WinMain ведь дал уже подсказку как это реализовать.
Нет.
Decoder писал(а):Теперь нужно создать массив из его элементов...
Зачем?
Decoder писал(а):Теперь нужно создать класс, в котором операторы инкремента/декремента будут изменять индекс массива и возвращать соответствующие элементы...
Ну изменю я индекс. И что?
Decoder писал(а):дописать лишь проверку корректности индекса,
И того: вместо решения задачи создана новая проблема контроля индекса не понятно чего.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:54
Сионист
WinMain писал(а):и возвращать соответствующие константы перечислителя, то это вполне реализуемо.
Нет, так как ни какие "константы" какого то загадочного перечислителя не существуют.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 14:59
Romeo
Странный диалог. Я тебе говорю, что ты не прав. А ты мне отвечаешь "Вот именно"
По поводу перегрузки операторов. Вот простенький пример, в коротом реализованы префиксные операторы ++ и --. Их постфиксные аналоги, а так же любые другие операторы, которые понадобятся, оставляю в качестве "домашнего задания".
Код: Выделить всё
#include <stdio.h>
enum EDirection
{
No = 0,
Up = 1,
Down = 2,
Left = 3,
Right = 4
};
EDirection& operator++(EDirection& dir)
{
dir = (Right == dir) ? No : EDirection((int)dir + 1);
return dir;
}
EDirection& operator--(EDirection& dir)
{
dir = (No == dir) ? Right : EDirection((int)dir - 1);
return dir;
}
int main()
{
EDirection dir = Right;
printf("dir = %d\n", (int)dir);
++dir;
printf("++dir = %d\n", (int)dir);
--dir;
printf("--dir = %d\n", (int)dir);
return 0;
}
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 15:36
Сионист
Romeo писал(а):Странный диалог. Я тебе говорю, что ты не прав.
. Не я. Читать
здесь до просветления.
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 15:37
Сионист
Romeo писал(а):Их постфиксные аналоги
А они то мне нафига?
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 15:39
Сионист
Правильно:
Код: Выделить всё
bool operator > (TPosition LeftOperand ,
TPosition RightOperand )
{
switch (LeftOperand)
{
case Left : return (RightOperand==FirstRight )||
(RightOperand==SecondRight)||
(RightOperand==Top )||
(RightOperand==LeftBottom )||
(RightOperand==Bottom )||
(RightOperand==RightBottom);
case Top : return (RightOperand==LeftBottom )||
(RightOperand==Bottom )||
(RightOperand==RightBottom);
case FirstRight : return (RightOperand==SecondRight)||
(RightOperand==Top )||
(RightOperand==LeftBottom )||
(RightOperand==Bottom )||
(RightOperand==RightBottom);
case SecondRight: return (RightOperand==Top )||
(RightOperand==LeftBottom )||
(RightOperand==Bottom )||
(RightOperand==RightBottom);
case LeftBottom : return (RightOperand==Bottom )||
(RightOperand==RightBottom);
case Bottom : return (RightOperand==RightBottom);
case RightBottom: return false;
}
return false;
}
?
Re: Можно ли перегрузить оператор инкремента для enum?
Добавлено: 04 апр 2014, 17:46
Romeo
Сионист писал(а):Не я. Читать здесь до просветления.
Извини конечно, но указанный пост я читал раз десять, и никакого просветвления не наступило. Ты объясняешься крайне сумбурно и несвязно.
Сионист писал(а):А они то мне нафига?
Не нужны - не пиши. Моё дело предложить.
Сионист писал(а):Правильно?
Нет, не правильно. Если даже исправить все синтаксические ошибки, коих масса, то всё равно останутся логические ошибки. Например, вот это место:
Код: Выделить всё
case RightBottom: return false]
Стесняюсь спросить, а зачем так мудрить? Чем плоха вот такая имплементация?
[code=cpp]
bool operator>(TPosition left, TPosition right)
{
return (int)left > (int)right;
}