Russian Qt Forum
Ноябрь 22, 2024, 11:48 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Имена enum'ов  (Прочитано 3280 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Февраль 07, 2018, 08:35 »

Добрый день

Делаем "совсем просто"
Код
C++ (Qt)
enum TFlagBit {
 bit_Selected,  
 bit_Hidden,
 ...  
};
Так имя недостаточно квалифицировано, кто-то еще запросто может иметь тот же bit_Selected (флажок популярный). Ладно, тогда так
Код
C++ (Qt)
struct MySomeClass {
...
enum TFlagBit {
  bit_Selected,  
  bit_Hidden,
  ...  
};
 
Все хорошо если юзаем внутри класса, но извне сопля MySomeClass::bit_Selected слишком длинная и изрядно засоряет текст. Варианты типа bit_SomeClassSelected и.т.п. чуть короче, но их придется писать везде

Так как же лучше писать?

Спасибо

Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #1 : Февраль 07, 2018, 08:39 »

Я бы использовал namespace. А потом using и не нужна полная квалификация.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #2 : Февраль 07, 2018, 09:11 »

Имхо, если C++11, то лучше писать

Код
C++ (Qt)
enum class MyEnum
{
   FirstValue,
   SecondValue
};
 
....
 
switch ( my_enum )
{
case MyEnum::FirstValue:
   ...
case MyEnum::SecondValue:
   ...
}
 
...
using AliasEnum = MyEnum;
 
switch ( my_enum )
{
case AliasEnum::FirstValue:
   ...
case AliasEnum::SecondValue:
   ...
}
 
 

До C++11 - так

Код
C++ (Qt)
struct MyEnum
{
   enum Enum
   {
       FirstValue,
       SecondValue
   };
};
 
...
 
switch ( my_enum )
{
case MyEnum::FirstValue:
   ...
case MyEnum::SecondValue:
   ...
}
 
...
typedef MyEnum AliasEnum;
 
switch ( my_enum )
{
case AliasEnum::FirstValue:
   ...
case AliasEnum::SecondValue:
   ...
}
 
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Февраль 08, 2018, 09:00 »

Я бы использовал namespace. А потом using и не нужна полная квалификация.
Так и делаю, ничего лучшего не нашел

Код
C++ (Qt)
switch ( my_enum )
{
case MyEnum::FirstValue:
   ...
 
В свитче даже очень длинное имя - не проблема, т.к. оно оформлено одной строкой. Но вот напр с if'ами
Код
C++ (Qt)
if (data[i].HasBitFlag(MySomeClass::FirstValue) && ...
Чижеловато читается/пишется
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 584


Просмотр профиля
« Ответ #4 : Февраль 08, 2018, 09:54 »

В свитче даже очень длинное имя - не проблема, т.к. оно оформлено одной строкой. Но вот напр с if'ами
Код
C++ (Qt)
if (data[i].HasBitFlag(MySomeClass::FirstValue) && ...
Чижеловато читается/пишется

Это дело вкуса). Но уж лучше так, чем

Код
C++ (Qt)
if (data[i].HasBitFlag(FirstValueMySomeClass) && ...

Да и вариант

Код
C++ (Qt)
using namespace MySomeNamespace;
using namespace MyOtherNamespace;
...
if (data[i].HasBitFlag(FirstValue) && ...

краткий, но не информативный, к тому же может ненароком перестать собираться, если в оба namespace поместить FirstValue.

А namespace не использовал, так как раньше для них нельзя было переопределение типов использовать, и они не могут быть частью класса или структуры, и "индусы" делали так):

Код
C++ (Qt)
class Q_CORE_EXPORT QSysInfo {
...
   enum Endian {
       BigEndian,
       LittleEndian
   };
...
};
 
...
 
class Q_CORE_EXPORT QDataStream
{
...
   enum ByteOrder {
       BigEndian = QSysInfo::BigEndian,
       LittleEndian = QSysInfo::LittleEndian
   };
...
};
 

вместо, например

Код
C++ (Qt)
class Q_CORE_EXPORT QSysInfo {
...
   struct Endian {
       enum Enum{
           BigEndian,
           LittleEndian
       };
   };
...
};
 
...
 
class Q_CORE_EXPORT QDataStream
{
...
   typedef QSysInfo::Endian ByteOrder;
...
};
 



« Последнее редактирование: Февраль 08, 2018, 09:58 от ssoft » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.247 секунд. Запросов: 23.