Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перечисления и константы... что и когда лучше? 
:(
    Опции темы
KL7
  Дата 4.8.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: нет
Всего: 2



Вопрос адресован к знающим людям, мнение которых хотелось бы услышать...
Вопрос касается скорее "грамотности" написания года...
Вопрос предполагается в контексте С++, поскольку в java enum-ы - ето что по истине нечто страшное, а где еще они бывают, я не знаю...

Ситуация проста: нужно иметь в своем распоряжении константу... Если ето как-то меняет дело, то будем считать, что константа находится внутри класса...

Известные мне варианты реализации:
Код

static const int N = 10;
enum { N = 10 };

Варианты похоже не сильно различаются в плане использования, но суть все же разная...
Какой вариант предпочтительнее и почему? Я правда не ожидаю, что у обычной константы могут быть явные преимущества, так что скорее интересуют доводы в пользу перечислений...

Пока я для себя решил (можете переубедить), что если мне нужно несколько однотипных констант, например, для размеров шрифта, то предпочтительнее реализовать ето через перечисления:
Код

enum FontSize { Low = 1, Normal = 3, High = 8 };

Такие константы вероятно будут использоваться в качестве аргументов и будет не плохо, если компилятор позаботится о том, чтобы в функции передавались только ети три значения, а не просто что-нибудь целочисленное...

Но что если нужна просто одиночная константа, скажем значение по умолчанию для ширины окна... В такой ситуации есть какие-либо преимущества у перечислений? Стоит ли все константы класса поместить в неименованный enum?

Буду рад услышать любое обоснованное мнение...
PM MAIL ICQ   Вверх
GoldFinch
Дата 4.8.2009, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



константы - когда нужен тип, перечисления - когда тип не нужен
PM MAIL ICQ   Вверх
Alca
Дата 4.8.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



Цитата

перечисления - когда тип не нужен

Код

    //file position data for the given stream
        typedef enum {
            ppBegin = SEEK_SET,    
            ppCurr  = SEEK_CUR,    
            ppEnd   = SEEK_END,
            ppError = - 1L    
        } EPointerPosition;

 smile 


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 4.8.2009, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  4.8.2009,  18:20 Найти цитируемый пост)
константы - когда нужен тип, перечисления - когда тип не нужен 

не согласен.


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 4.8.2009, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



mes, а обосновать?


Alca, говоря "тип" я имел ввиду то что в случае
const short x = 1;
у x будет тип short, а в случае
enum E { .... . x=1, ... }
у x тип будет эквивалентен int

в случаях когда константа должна иметь конкретный тип, с конкретным sizeof, отличный от других типов, надо использовать константы,
а там где это не надо - проще и удобнее перечисления

Добавлено через 5 минут и 40 секунд
например для формирования пакета надо записать в поток id пакета длиной байт
можно написать 
Код

struct out_id
{
    ...
    static const unsigned char some_id = 100;
    ...
};
...
out << out_id::some_id;

а можно написать 
Код

enum out_id
{
    ...
    some_id = 100,
    ...
};
...
out << (unsigned char) some_id;

так вот в этом случае нужно чтобы константа имела конкретный тип, поэтому лучше 1й вариант
PM MAIL ICQ   Вверх
Alca
Дата 4.8.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 7
Всего: 50



enum имеет тип int

Это сообщение отредактировал(а) Alca - 4.8.2009, 20:29


--------------------
PM WWW ICQ Skype Jabber   Вверх
mes
Дата 4.8.2009, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(GoldFinch @  4.8.2009,  19:17 Найти цитируемый пост)

а в случае
enum E {
у x тип будет эквивалентен int 

подтип.

Код

namespace Side      { enum EType { eLeft, eTop, eRight, eBottom }; }
namespace Direction { enum EType { eNorth, eEast, eSouth, eWest }; }

void f (Side::EType)
{
    std::cout << "This is a Side enum" << std::endl;
}
void f (Direction::EType)
{
    std::cout << "This is a Direction enum" << std::endl;
}
void f (int)
{
    std::cout << "This is a int" << std::endl;
}

int main(void)
{

    f(1);
    f(Direction::eEast);
    f(Side::eBottom);

    return 0;
}



Это сообщение отредактировал(а) mes - 4.8.2009, 20:49


--------------------
PM MAIL WWW   Вверх
vinter
Дата 4.8.2009, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



KL7, это индивидуальный стиль каждого программиста, ты должен сам видеть и понимать,, что и где тебе нужно. Нет четких правил, которые бы стоило уяснить и использовать, так что используй воображение и  свои предпочтения.


--------------------
Мой блог
PM MAIL WWW   Вверх
Alek86
Дата 4.8.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



1. указатель на константу можно передать в функцию. указатель на элемент энама - нет
2. глобальная константа "загрязяет" глобальное пространство имен для линковщика. неименованный енум, вроде, не загрязняет

в остальном они очень похожи


--------------------
user posted image    user posted image
PM MAIL   Вверх
andrew_121
Дата 4.8.2009, 22:09 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(Alek86 @  4.8.2009,  22:04 Найти цитируемый пост)
глобальная константа "загрязяет" глобальное пространство имен для линковщика.

И чем это грозит?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Dmi3ev
Дата 4.8.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

Репутация: 1
Всего: 41



вот тут enum меня выручил, а static const int нельзя было применить...
http://forum.vingrad.ru/forum/topic-263382/0.html
а если можно юзать и то, и другое, то сам смотри... принципиальной разницы я не вижу...


--------------------

PM MAIL   Вверх
KL7
Дата 5.8.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 59
Регистрация: 7.12.2008
Где: Minsk City

Репутация: нет
Всего: 2



как и ожидалось вопрос не однозначный... 
спасибо, GoldFinch, про потребность конкретного типа у константы я усвоил...
кто что еще может ценного сказать? 

Цитата(Dmi3ev @  4.8.2009,  22:16 Найти цитируемый пост)
вот тут enum меня выручил, а static const int нельзя было применить...

что-то я как и azesmcar так и не понял, чем же там константа не угодила... 

Цитата(andrew_121 @  4.8.2009,  22:09 Найти цитируемый пост)
И чем это грозит? 

вероятно конфликтами одноименных констант...

Цитата(vinter @  4.8.2009,  20:44 Найти цитируемый пост)
KL7, это индивидуальный стиль каждого программиста, ты должен сам видеть и понимать,, что и где тебе нужно. Нет четких правил, которые бы стоило уяснить и использовать, так что используй воображение и  свои предпочтения. 

так-то оно так, но если писать код только как хочется, то может так оказаться, что потом с етим кодом будет стыдно в приличном обществе показаться =) вот и интересуюсь... 

PM MAIL ICQ   Вверх
zim22
Дата 5.8.2009, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(Alek86 @  4.8.2009,  22:04 Найти цитируемый пост)
2. глобальная константа "загрязяет" глобальное пространство имен для линковщика. 

 smile 
По умолчанию (без слова extern) const подразумевает внутреннюю компоновку. Так что константа, определённая в глобальном пространстве имён является локальной для той единицы компиляции, в которой она определена.

Это сообщение отредактировал(а) zim22 - 5.8.2009, 08:39


--------------------
PM MAIL   Вверх
azesmcar
Дата 5.8.2009, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Насчет "нужности" типа перечисления уже была дискуссия
http://forum.vingrad.ru/forum/topic-257983...tml#st_0_view_0

PM   Вверх
Alek86
Дата 5.8.2009, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1299
Регистрация: 30.1.2007
Где: Киев

Репутация: 21
Всего: 25



Цитата(zim22 @  5.8.2009,  08:39 Найти цитируемый пост)
По умолчанию (без слова extern) const подразумевает внутреннюю компоновку. Так что константа, определённая в глобальном пространстве имён является локальной для той единицы компиляции, в которой она определена.

мда, прогнал


--------------------
user posted image    user posted image
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0612 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.