Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2017, 05:02   #11
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от KAMLS Посмотреть сообщение
А как их различают, по среде? И где список изменений по обновлениям? Это типа как WoT?
Это задается при компиляции параметром командной строки компилятора, например для g++ будет так

g++ --std=c++11

g++ --std=c++14

Если вы пользуетесь средой, нада искать в настройках проекта настройку "стандарт" и ее установить/изменить.

Список изменений? Вот например книга, по основным новшествам
http://shop.oreilly.com/product/0636920033707.do

Переводы ищите сами - я ее в оригинале читаю. Но она, предполагает, что вы уже знакомы с исходным стандартом. В книге показаны различия.

...отвечая на исходный вопрос - перечисления, это способ как-то избавится от кучи глобальных названий, т.е. как-то систематизировать и назвать числа(константы).
Есть такой термин "магическое число", когда вы читаете код, например:

someLongFunction(3,5,7)

и вот тут совершенно не ясно, что такое 3-5-7.

Во избежание этого применяются именованые константы и дефайны, например

#define AMOUNT_OF_BALLS 3
someLongFunction(AMOUNT_OF_BALLS,5, 7)

Но это устаревший подход, т.к. слабо контроллируется компилятором. Поэтому придумали enum

enum PossibleBallsCount {BALL_3 = 3, BALL_2 = 2};

someLongFunction(BALL_3 ,5,7)

Но это тоже плохо работает, потому что по прежнему можно писать число 3 вместо BALL_3.

В С++11 ввели

enum class PossibleBallsCount {BALL_3 = 3, BALL_2 = 2};
someLongFunction(PossibleBallsCount ::BALL_3 ,5,7)

Теперь уже нельзя написать 3 вместо названия, а нужно писать полное имя PossibleBallsCount::BALL_3
т.о. компилятор четка отслеживает верное ли вы название вписали и выдает ошибки. Меньше проблем человеку.

Применять enum нужно, когда есть некоторое число вариантов, и нужно указать какой-то, например, пол м/ж, выбор датчика (компас/ускорение/гироскоп) и т.д. При этом, вся остальная программа предполагается одинаковой для любого выбранного элемента. Скажем, если вы делаете чтение датчиков по юсб, то наверняка, каждый будет иметь собственный уникальный протокол. Т.о. энюм в данном случае лиш усложнит - будут тонны условий у вас. Здесь лучше сделать разные классы с одинаковым предком.
Палитра цветов с именами (например, 20 цветов) для рисования кнопки - вполне хороший кандидат на enum.

Вот этот ваш "изврат"
Код:
class String
{
private:
enum {SZ=80;};
char str[SZ];
я бы сделал так (с сохранением логики изврата, пока не будем о ней - она тоже не верна)
Код:
class String
{
private:
static const int getSz() {return 80;}
char str[getSz()];
хотя я не совсем уверен в компилируемости этого фрагмента ))
В С++11

Код:
class String
{
private:
constexpr int getSz() {return 80;}
char str[getSz()];
так точно скомпилит

Последний раз редактировалось alexzk; 13.04.2017 в 05:37.
alexzk вне форума Ответить с цитированием
Старый 13.04.2017, 08:15   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В VS без параметров (ну или включены по умолчанию), некоторые фичи С++11 есть с 2010, но в основном с 2012-2013.

Список поддерживаемых фич по версиям VS: https://msdn.microsoft.com/en-us/library/hh567368.aspx
Или для всех компиляторов: http://en.cppreference.com/w/cpp/compiler_support

Описания изменений много где есть, например по ссылкам выше.
Или тут более кратко и на русском: https://ru.wikipedia.org/wiki/C%2B%2B11
Или еще более кратко основные фичи: https://habrahabr.ru/post/182920/
Или Effective Modern C++ Мейерса. (Ну и его же Effective C++ тоже во многом актуальна и рекомендуется к прочтению)
http://www.programmersforum.ru/showt...602#post221543

Цитата:
Сообщение от alexzk Посмотреть сообщение
хотя я не совсем уверен в компилируемости этого фрагмента
Вряд ли компилируется, скорее всего так
Код:
static const int SZ = 80;
char str[SZ];
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 13.04.2017 в 08:30.
Alex11223 вне форума Ответить с цитированием
Старый 13.04.2017, 08:34   #13
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение


Вряд ли компилируется, скорее всего так
Код:
static const int SZ = 80;
char str[SZ];
Помоему тоже нет (точнее, будет копия SZ в каждом юните ...), но трюк я использую, когда нет CPP файла вот так:

Код:
class String
{
private:
static const int getSz() {return 80;}
char str[];
String():str[getSz()]{}
В таком ключе, хотя конкретно массивы ниразу так не делал, ибо есть вектор и стдстринг.
Все же думаю, с массивами так не взлетит, собственно для этого и ввели constexpr.

Последний раз редактировалось alexzk; 13.04.2017 в 08:38.
alexzk вне форума Ответить с цитированием
Старый 13.04.2017, 18:48   #14
KAMLS
Форумчанин
 
Регистрация: 09.04.2017
Сообщений: 598
По умолчанию

Спасибо Вам всем. Я пока не такой умный)) У меня VS 2008. Изучаю С++ по книге Р.Лафоре. Там VS вообще я так понял давнишний. Вот закончу изучать основу, тогда и обновления изучу)))
По Лафоре, я так понял имена перечисления имеют значения по умолчанию от 0.
Если я хочу задать другие значения, то первому имени назначаю своё значение, а далее по порядку. Тот эпизод с enum который рассматривается в теме "Классы", я так понял применяется в виде такого первоначального значения, а используется как константа. Ведь если я правильно понял концепцию класса, инициализация в классе не делается.
Это делают методы и их вид конструкторы.
Так?
KAMLS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перечисления. Метод GetValue в цикле. BadCats C# (си шарп) 3 06.04.2016 08:18
перечисления в связке с циклом (C#) BadCats Помощь студентам 7 08.02.2016 18:43
Перечисления в CLR проектах cojuer Visual C++ 1 30.07.2013 09:45
ENUM-перечисления.Вовпрос? Goody Общие вопросы C/C++ 5 18.04.2012 01:44
Перечисления в классах (С++) Александр Елис Помощь студентам 1 22.01.2010 17:10