Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
1

Типизированные перечисления как флаги

16.03.2016, 17:29. Просмотров 886. Ответов 4
Метки нет (Все метки)

Очень понравилась идея с указанием идентификатора типа перечисления при обращении к нему, код раза в два становится приятней. Но как использовать такие перечисления в качестве класса? Обычные можно, поскольку они по дефолту int:
C++
1
2
3
4
5
6
7
8
9
enum Trouble {
   disconnect,
   bad_data,
   ...
};
 
...
 
Trouble tr = disconnect | bad_data;
Если добавить class, так не выйдет. Есть ли выход? Постоянное приведение к числовому типу при битовых операциях, понятно, выходом не является
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.03.2016, 17:29
Ответы с готовыми решениями:

Как реализовать флаги в параметрах функции
Объясните пожалуйста как реализовать флаги в параметрах функции. К примеру: ...

Как правильно впихнуть и использовать перечисления в структуре?
// Test_Project.cpp: определяет точку входа для консольного приложения. // ...

Упражнение из Лафоре. Тема Перечисления. Как правильно сделать вывод?
Условие: в программе определен печесляемый тип данных etype, отражающий...

Перечисления (enum): для чего они нужны? Как, когда и какими перечислениями уместнее пользоваться?
Предположим есть такой код: #include <iostream> #include <iomanip> #include...

Флаги
Подскажите для чего используются эти флаги: setiosflags(ios::fixed |...

4
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
16.03.2016, 17:42 2
Лучший ответ Сообщение было отмечено tnk500 как решение

Решение

tnk500,
C++
1
2
3
4
5
6
7
8
9
class SomeClass
{
public:
    enum Trouble {
       disconnect    =    1 << 1,
       bad_data      =    1 << 2,
       ...           =    1 << ...
    };
};
1
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
16.03.2016, 17:58  [ТС] 3
GbaLog-, делал то же самое, только с функцией приведения, ну и типизированное перечисление засовывал. Было бы неплохо вообще, если бы организовали неявное приведение к типу, от которого образуется перечисление (enum class Enum : short)

Добавлено через 4 минуты
Только теперь при объявлении переменной её тип придётся отмечать как "SomeClass::Trouble". Ну да ладно.
0
GbaLog-
Любитель чаепитий
3165 / 1471 / 465
Регистрация: 24.08.2014
Сообщений: 5,204
Записей в блоге: 1
Завершенные тесты: 2
16.03.2016, 18:00 4
tnk500, В общем не знаю, что вы там делали, но вот что я раскопал у себя в "архиве".
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
// flags
#include <iostream>
using namespace std;
 
class flags {
    public:
        enum sMode {
            eFirst  = 1<<1,
            eSecond = 1<<2,
            eThird  = 1<<3
        };
        
        flags(const int _flags) : m_flags(_flags) {}
        
        void showFlags() const {
            if(has_(eFirst))
                cout << "First flag enabled" << endl;
            if(has_(eSecond))
                cout << "Second flag enabled" << endl;
            if(has_(eThird))
                cout << "Third flag enabled" << endl;
            cout << endl;
        }
        
        void show(const int _flag) {
            m_flags |= _flag;
        }
        
        void hide(const int _flag) {
            m_flags &= (~_flag);
        }
        
        void unsetAll() {
            m_flags &= (~m_flags);
        }
        
    private:
        bool has_(const int _flags) const {
            return (_flags & m_flags) == _flags;
        }
        int m_flags;
};
 
int main()
{
    typedef flags MODE;
    flags flag(MODE::eFirst|MODE::eSecond);
    flag.showFlags();
}
0
tnk500
114 / 118 / 42
Регистрация: 25.08.2012
Сообщений: 1,294
Завершенные тесты: 3
16.03.2016, 18:11  [ТС] 5
GbaLog-, а, всё понял. Спасибо
0
16.03.2016, 18:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.03.2016, 18:11

Флаги С++
Всем привет. У меня есть задача, сделать с классами программу, используя...

Флаги выравнивания
Просветите пожалуйста ) :wall: Как выровнять по левому краю такое :...

Не работают флаги
#include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include &lt;iostream&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru