Enum и операции с ним

Что не так?

дак ты нигде не проверяешь выход за границы перечисления.

А, ну это вопрос другой… ))

ну и старайся вместо тупого приведения типов использовать static_cast<>, тогда компилятор явно видит что во что ты хочешь преобразовать и выдаст ошибку или предупреждение, что это невозможно или приведет к потере данных. В случае же тупого приведения, компилятор приведет, канеш, как ему Б на душу положит, даже неприводимое, но принесёт ли это тебе радость, када ты будешь мудохацца, не понимая где ты ошыпса.

1 лайк
error: no match for 'operator+' (operand types are 'ActionList' and 'int')
 AL = ActionList(AL + 1);
                            ^

Тогда уж вот так:

AL = ActionList((int)AL + 1);

но это кривовато, почему - Дед выше написал

Добавка.
Кроме того, это у тебя постинкремент, а пост инкремент должен возвращать ссылку на старое значение, чего у тебя нет.

1 лайк

тока не int а uint8_t

про это я тоже в #25 писал

ну как бы можно поспорить :slight_smile:
При определении своего енума ты не указал явно тип элемента, поэтому по умолчанию он инт будет… Поэтому, имхо, не вполне логично, что ты его в uint8_t кастишь.

1 лайк

канешна же я ошибся. Правильно так

enum class TAction : uint8_t { Zero = 0x00, One = 0x01, Two = 0x02, Three = 0x03 };

Спасиба, счас поправлю

Это же должен делать преинкремент?

uint8_t i = 0;
++i;

Преинкремент увеличивает на один и возвращает результат. А пост-инкремент инкрементирует, но возвращает прежнее значение. Это значит, что ты перед прибавлением единицы должен сохранить ссылку на прежнее значение енума во временной переменной, потом инкрементнуть основной енум и вернуть ссылку на временный.

Как-то так(определение а++ через ++а)

TAction operator++(TAction& a, int)
{
  TAction tmp(a);
  ++a;
  return tmp;
}

(исходим из того что опратор ++а определен ранее)

3 лайка

Кстати, пример выше является ответом на вопрос: “почему лучше пользоваться прединкрементом?”. Потому что постинкремент засирает память копиями.