Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Оформление константных значений в классах С++

535
19 сентября 2008 года
Нездешний
537 / / 17.01.2008
Как-то понял, что значительную часть обращений к хелпам (у меня лично), составляет поиск констант, определенных для функции или класса. Причем часто бывают случаи, когда вроде бы помнишь, что была какая-то константа, но не помнишь точного написания. Лезть только за тем, чтобы посмотреть "ios::trunc" там, или "ios::truncate", довольно напрягает.
Для себя вместо #define'ов при написании классов принял стиль:
 
Код:
class SomeClass
{
...
public:
       static const SOME_CONST1 = ...;
       static const SOME_CONST2 = ...;
...
};

Есть еще вариант:
 
Код:
class SomeClass
{
...
public:
      const SOME_CONST1;
      const SOME_CONST2;
...
      SomeClass():  SOME_CONST1 = ... , SOME_CONST2 = ... {}
};

При таком оформлении они высвечиваются во всплывающей подсказке при кодинге, что довольно удобно. Особенно, если их имена начинать с пары одинаковых символов, чтобы в подсказке все константы были рядом.
Интересно ваше мнение по этому вопросу.
Страницы:
5
19 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Нездешний
Для себя вместо #define'ов при написании классов принял стиль...

Дефайны - великое Зло.
Забавно. Подобный подход уже давно принят во многих языках. Странно, что вы узнали об этом лишь недавно.

87
19 сентября 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Нездешний
Интересно ваше мнение по этому вопросу.


Тип забыл.

Про статические констаны в классе интересно. Я использовал для констант отдельное пространство имен. Надо подумать, что лучше.

Тема инициализации констант в конструкторе не раскрыта. Тут надо сделать возможность задания разных констант для экземпляров класса, иначе лучше вариант со статическими константами.

288
19 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Цитата: hardcase
Дефайны - великое Зло.



Нет, ну почему же. Очень часто довольно полезная штука и в плане производительности и в плане удобства. Хотя конечно при отладке могут возникнуть проблемы. Но если работать с ними правильно и не писать подобного

 
Код:
#define TRUE FALSE

:), то проблем обычно не возникает.
Хотя это дело вкуса каждого.
341
19 сентября 2008 года
Der Meister
874 / / 21.12.2007
[QUOTE=nikitozz]Очень часто довольно полезная штука и в плане производительности...[/QUOTE]Улыбнуло
[QUOTE=nikitozz]...и в плане удобства[/QUOTE]const int someconstant = 5 всегда удобнее, чем #define someconstant 5.
Макросы же, в общем случае, - средство полезное и очень мощное, но стоит трижды подумать, прежде чем вводить в код новый макрос. В любом случае, использование макроподстановок вместо констант лично я считаю недопустимым.
З. Ы. Кстати, в именованном скоупе имена в стиле SOME_CONST1 как-то уже и неактуальны, на мой взгляд...
502
19 сентября 2008 года
Jail
550 / / 30.01.2007
#define - такое же зло, как и глобальные переменные в ООП. От этого нужно стараться отходить и если не целиком и полность, то для начала желательно сократить их число к минимуму. В любом учебнике про это пишут и Страуструп тоже акцентирует на этом внимание.
Во многих случаях макросы следовало бы заменять на inline функции, а от констант, определенных с #define - избавляться.
12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
To all:

Почти все пишут, что глобальные переменные и #define это зло. Я согласен, но автор вроде, совсем не про это спрашивал :)

Вот например про #define:
Цитата: Нездешний

Для себя вместо #define'ов при написании классов принял стиль:

12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
На счет констант в классе, я бы сделал их статическими членами, так как они предполагаемо будут принадлежать типу а не объекту. И неудобно ими пользоваться если для этого надо будет создавать объект класса.
9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Скажите а какой толк от констант в классе? 100% обьектно ориентированный язык поискать еще нужно, как будто программа будет лучше работать. Если где то понадобится эта константа, еще искать этот класс, потом окажется что этот класс в другой области видимости, а на самом деле в классе с таким же названием константы нету..и т д, а ведь надо было всего то один раз получить эту константу.

В чём проблемма глобальных констант?

const HOHOHO = 0; написать один раз в верхушке хидера и никаких недоразумений.

Кстати нащёт констант внутри классов. Константы принято писать в верхнем регистре, но таким же образом пишутся и типы. У меня была ситуация, когда такая вот константа(тольков классе как я потом проверил) начинала выдавать такие ошибки в компиляторе и линкере, что найти ошибку было очень тяжело. А всё дело было в том что название константы совпало с каким-то типом. А компилятор начал ругатся вообще на какую то там строчку связанную с проблеммой очень отдалённо. Страшная сказочка))
3
20 сентября 2008 года
Green
4.8K / / 20.01.2000
Цитата: iridum
Скажите а какой толк от констант в классе?


А какой толк от констант в namespace?
Ответ прост - конкретизация.
Зачем, к примеру, константа basic_string::npos будет глобальной?
А ios::eofbit, ios::badbit ?

Цитата: iridum

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


Ну к примеру C++, чем не ООП?
Конечно будет лучше работать, т.к. будет разрабатываться лучше.

Цитата: iridum

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


Ага, вместо того, чтоб убирать вещи на место, прощу жить на помойке, где все под рукой... только вот иногда можно этой рукой вляпаться в г...но, т.к. на помойке под рукой ВСЁ.

Цитата: iridum

В чём проблемма глобальных констант?


В том же в чем и глобальных переменных,- в их глобальности.

Цитата: iridum

const HOHOHO = 0; написать один раз в верхушке хидера и никаких недоразумений.


А потом думать, чем этот HOHOHO лучше, чем HOHOHO объявленный в соседнем хидере. И к чему он собственно этот HOHOHO относится?

Цитата: iridum

Кстати нащёт констант внутри классов. Константы принято писать в верхнем регистре, но таким же образом пишутся и типы.


Это у кого "принято"?
Давай, не будем обобщать.

Цитата: iridum

У меня была ситуация, когда такая вот константа(тольков классе как я потом проверил) начинала выдавать такие ошибки в компиляторе и линкере, что найти ошибку было очень тяжело. А всё дело было в том что название константы совпало с каким-то типом. А компилятор начал ругатся вообще на какую то там строчку связанную с проблеммой очень отдалённо. Страшная сказочка))


Страшная и неправдоподобная...
Лучше бы её было начать так: "слышал я от одного уважаемого человека...", или даже так: "друг друга брата моего товарища ещё по дет.саду..."

12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Цитата: iridum
Скажите а какой толк от констант в классе?



Смысл констант бывает разный:
- применимые к объекту определенного типа;
- глобального назначения;
- ...

Цитата: iridum
100% обьектно ориентированный язык поискать еще нужно, как будто программа будет лучше работать.


При чем тут объектно ориентированность языка?

Цитата: iridum
Если где то понадобится эта константа, еще искать этот класс, потом окажется что этот класс в другой области видимости, а на самом деле в классе с таким же названием константы нету..и т д.


Зачем напичкивать класс бессмысленными произвольными константами которые могут понадобится всем и которые к классу не относятся?

Класс должен содержать только относящиеся к нему константы, например класс File может содержать константы обозначающие типы открытия файла (на чтение, запись и т.п.). Может пример не очень удачный, т.к. тут вообще лучше перечисление использовать ибн enum. Но это как пример, нет времени выдумывать что-то более в тему.

Цитата: iridum
а ведь надо было всего то один раз получить эту константу


А зачем она такая нужна, если только 1 раз?

9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Цитата: Green

Страшная и неправдоподобная...
Лучше бы её было начать так: "слышал я от одного уважаемого человека...", или даже так: "друг друга брата моего товарища ещё по дет.саду..."



Не люблю спорить потому и не буду ).
А вот насчёт сказочки, то это реальная история которая приключилась со мной. И искал ошибку я очень долго, я был просто в шоке. Не буду описывать как так получилось, но получилось забавно - и это было не обычное совпадение имен.
Насчёт помойки, то это тоже спорный вопрос, потому что помойка это когда что то лежит в одном мусорном контейнере, а что то в другом мусорном контейнере (наблю даешь аналогию??), но это я только про константы.

9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Цитата: __AleXX__
Зачем напичкивать класс бессмысленными произвольными константами которые могут понадобится всем и которые к классу не относятся?



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

К примеру для чего делали такие файлы как winbase.h и т. д. Там где списки констант. Да потому что если бы каждый делал в своём классе(так оно и было наверное), и не писал бы в отдельный файл(для напоминаний и часто использования), то была бы действительно огромная помойка.

12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Цитата: iridum
... но для меня удобство констант еще и в том, что я не должен лезть куда небудь и искать название, возможно это лично мой подход, но для констант я себе оставил вариант быстро найти название, именно потому и пишу сверху хидера.



Я и не говорил, что константы надо писать где-то в другом месте.
Обычно делаю так:
1. Те, что в классах - идут сверху описания класса.
2. Глобальные - сверху хедера или исходника.

Т.е. там где их проще будет найти.

3
20 сентября 2008 года
Green
4.8K / / 20.01.2000
Цитата: iridum

Не люблю спорить потому и не буду ).


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

Цитата: iridum

Насчёт помойки, то это тоже спорный вопрос, потому что помойка это когда что то лежит в одном мусорном контейнере, а что то в другом мусорном контейнере (наблю даешь аналогию??), но это я только про константы.


Неа, не наблюдаю.
Для меня помойка - противоположное упорядоченности.

Цитата: iridum
Абсолютно согласен, но для меня удобство констант еще и в том, что я не должен лезть куда небудь и искать название, возможно это лично мой подход, но для констант я себе оставил вариант быстро найти название, именно потому и пишу сверху хидера.


Создается впечатление, что больше одного заголовочного файла в единицу компиляции не включалось... Одноименных констант не встречалось. Констант привязанных к содержимому класса (например, как npos) не находилось...

9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Green, ты думаешь с одним подключеным хидером проэкт будет 20 минут компилироватся ? Я думаю что компилятор просто не потянет такой размер хидера, если бы такой был.

Насчёт той сказочки с ошибкой, могу на досуге рассказать, еще помню.

Насчёт упорядоченности констант в классах. Смотри есть куча классов. Ты делаешь еще какие либо. В них нужны схожие имена кнстант(для того чтобы в проэкте всё было красиво и каждый программист чисто логически понял назначение новой константы по аналогии со старой). И тут получается что создаётся класс и в нём придумывают соверженно другие константы, бред. Ну и где тут помойка?
12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Цитата: iridum
Green, ты думаешь с одним подключеным хидером проэкт будет 20 минут компилироватся ? Я думаю что компилятор просто не потянет такой размер хидера, если бы такой был.



Давай не будем рассуждать о том чего не знаем.

Цитата: iridum
Насчёт упорядоченности констант в классах. Смотри есть куча классов. Ты делаешь еще какие либо. В них нужны схожие имена кнстант(для того чтобы в проэкте всё было красиво и каждый программист чисто логически понял назначение новой константы по аналогии со старой). И тут получается что создаётся класс и в нём придумывают соверженно другие константы, бред. Ну и где тут помойка?



Пример, пожалуйста. Не думаю что ты прав. Что значит "придумывают совершенно другие константы"?

3
20 сентября 2008 года
Green
4.8K / / 20.01.2000
Цитата: iridum
Green, ты думаешь с одним подключеным хидером проэкт будет 20 минут компилироватся ? Я думаю что компилятор просто не потянет такой размер хидера, если бы такой был.


Э... не понял к чему это?
Кстати, интересная задачка: придумать минимальную программу с максимальным временем компиляции. :)

Цитата: iridum

Насчёт той сказочки с ошибкой, могу на досуге рассказать, еще помню.


Лучше пример кода покажи и загадочное сообщение об ошибке.

Цитата: iridum

Насчёт упорядоченности констант в классах. Смотри есть куча классов. Ты делаешь еще какие либо. В них нужны схожие имена кнстант(для того чтобы в проэкте всё было красиво и каждый программист чисто логически понял назначение новой константы по аналогии со старой). И тут получается что создаётся класс и в нём придумывают соверженно другие константы, бред. Ну и где тут помойка?


Ну я же тебе уже привел примеры таких констант, где значение может быть различное для разных классов: npos, badbit и т.п.
Могу придумать: max_size, classID, typeID, max_value, и т.п.

9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Цитата: __AleXX__
Давай не будем рассуждать о том чего не знаем.



Я буду)) когда то згенерированный кусок кода размером под 5метров я пробывал скомпильнуть. Это было зверство. Иде просто умерло.

Цитата:

Пример, пожалуйста. Не думаю что ты прав. Что значит "придумывают совершенно другие константы"?

Я имею ввиду, что допустим касается константа диска, название DSC_OUT, касается файловой системмы, FSS_OUT. А тут появляется нечто вроде HOHOHOHO ))

12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Цитата: iridum
Я буду)) когда то згенерированный кусок кода размером под 5метров я пробывал скомпильнуть. Это было зверство. Иде просто умерло.


А причем тут размер генерированного файла и вообще компилирование больших кусков кода к тому что мы обсуждали? Возможно я просто не так тебя понял, потому и написал "Давай не будем рассуждать о том чего не знаем."

Цитата: iridum
Я имею ввиду, что допустим касается константа диска, название DSC_OUT, касается файловой системмы, FSS_OUT. А тут появляется нечто вроде HOHOHOHO ))



как этот ответ относится к тому что я написал по поводу:

Цитата: iridum
Насчёт упорядоченности констант в классах. Смотри есть куча классов. Ты делаешь еще какие либо. В них нужны схожие имена кнстант(для того чтобы в проэкте всё было красиво и каждый программист чисто логически понял назначение новой константы по аналогии со старой). И тут получается что создаётся класс и в нём придумывают соверженно другие константы, бред. Ну и где тут помойка?



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

9.3K
20 сентября 2008 года
iridum
175 / / 26.08.2007
Цитата: __AleXX__

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



К щастью мне не сложно догадатся что ты хочешь сказать. У меня своя конкретика. Поподробнее. Нащёт констант. Определяй как хочешь. Хочешь в классе - давай в классе, хочешь вне - можно вне. Что я тебе хотел сказать ? Хотел сказать что лично мне приятнее когда мои константы рядом, названия по стантарту, и когда я смогу всегда их быстро найти. Пример мне лень писать. Если мой стиль не устраивает - пожалуйста, это еще не говорит о том что у меня программы хуже работают. мол, еретик он нарушил постулаты божественного ООП.

12K
20 сентября 2008 года
__AleXX__
133 / / 02.04.2007
Я что-то говорил про ООП?

Я же не заставляю определять константы только в классах :)
Просто говорил, что их надо определять по смыслу, там где они, так сказать, нужны.

Достаточно удачный пример со строкой (std::string), у которой в качестве константы есть npos, просто, удобно, понятно - и всем известно, что std::string::npos - означает как сказано в МСДН: "An unsigned integral value initialized to –1 that indicates either "not found" or "all remaining characters" when a search function fails"
И всем понятно что эта условность применима только к классу std::string, и использовать данную константу больше ни счем нельзя, т.к. никто не гарантирует, что разработчики не захотят её значение поменять на -2 например, тогда все что касается std::string работать будет корректно, а др. места где ее использовал - врядли.

Вот тебе смысл констант принадлежащих классу.

То, что ее значение менять врядли кто-то будет, это уже др. момент
1.9K
20 сентября 2008 года
InterWen
331 / / 16.09.2006
Цитата: iridum
Если мой стиль не устраивает - пожалуйста, это еще не говорит о том что у меня программы хуже работают. мол, еретик он нарушил постулаты божественного ООП.



"Any idiot can write code that computer can compile, but it takes a good programmer to write code that human beings understand." (c) [COLOR="Gray"](сорри, авторства не помню, но плюспиццот однозначно)[/COLOR]

5
20 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: iridum
К примеру для чего делали такие файлы как winbase.h и т. д. Там где списки констант.

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

5
20 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Green
ЭКстати, интересная задачка: придумать минимальную программу с максимальным временем компиляции. :)

Была такая тема. Тут.

288
20 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
Что касается объявления констант, то без сомнений - объявлять их глобальными в хидере, как минимум неудобно. Здесь я ничего нового не сказал.
Но вот отказываться от #define'ов - это уже проблематичней. #define может и зло, и об этом пишут много авторов. НО. Кто из пишущих на C/C++ уже не пишет #define ........... ? Помимо этого существует еще масса процедурных библиотек, который активно используют #define для объявления констант. Работая с ними, волей не волей приходится работать с #define константами. Можно конечно для удобства создать для этих библиотек объектно-ориентированную оболочку и переопределить #define константы в члены класса, но очень часто это нецелесообразно и на это просто нет времени.
87
20 сентября 2008 года
Kogrom
2.7K / / 02.02.2008
Вообще, в данной области у меня есть пара вопросов, которые я пока не решил или не понял.

1. С одной стороны лучше делать заголовочные файлы, которые используются более чем в двух исходных файлах маленькими, чтобы изменения в них создавались реже. Благодаря этому реже придется перекомпилировать большие куски программы.

Исходя из этого, если в классе много полей, то лучше не делать статические константы класса, а размещать их в отдельном заголовочном файле, в определенном пространстве имен (возможно, в том же, где находится класс).

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

2. Избавиться от констант #define я не могу, так как использую диалоговые окна в ресурсах, а компилятор ресурсов не понимает иные обозначения – не хочет переваривать enum-ы и другие константы.

Пока успокаиваю себя тем, что создание имен констант для обозначения ресурсных объектов имеет определенные традиции, которые не используются при создании других констант. Кроме того, в исходниках других программистов я не видел решение этой проблемы.
502
21 сентября 2008 года
Jail
550 / / 30.01.2007
to iridum, блин вот помоему ты вообще не понимаешь что такое ООП, что такое инкапсуляция и т.д., а ко всему прочему ты мыслишь как обыкновенный Си'шник/"процедурник"; прочитав все твои топики в этой теме мне именно так и показалось. Если бы ты хоть одну програмку написал не на С/С++, а к примеру на Java, ты бы понял почему глобальные переменные это не только зло, но и запрет вовсе и может быть даже бы понял что такое ООП, и т.д.
Будь добр, не пудри новичкам мозги и не збивай их с толку.
341
21 сентября 2008 года
Der Meister
874 / / 21.12.2007
Цитата:
Если бы ты хоть одну програмку написал не на С/С++, а к примеру на Java, ты бы понял, почему глобальные переменные - это не только зло, но и запрет вовсе, и может быть даже бы понял, что такое ООП, и т.д.

Math.PI - мне нравится :) Глобальные переменные - не столько зло, сколько вопиющий признак неверного планирования взаимодействия компонентов ООП решения в единице компиляции. Я к тому, что проблемы могут быть куда более масштабными, чем те, что связаны с аномнимным пространством имён и модификациией значения разделяемой переменной. А сам по себе запрет, при желании, легко преодалевается: можно ведь применить public static для полей :)

240
22 сентября 2008 года
aks
2.5K / / 14.07.2006
Цитата: iridum
Green, ты думаешь с одним подключеным хидером проэкт будет 20 минут компилироватся ? Я думаю что компилятор просто не потянет такой размер хидера, если бы такой был.


А ты в курсе как вобще директива #include работает? ))

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

Цитата: hardcase
Там списки констант не из-за этого.
WinAPI - процедурная библиотека на C ориентированная, оттого подход процедурный используется.


Не совсем С, но суть та. Описано там все действительно в стиле С. Приводить ее в пример - смысла нет.

353
22 сентября 2008 года
Nixus
840 / / 04.01.2007
Опять одни догмы. Все хорошо в меру и зависит от конкретной задачи.
5
22 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Nixus
Опять одни догмы. Все хорошо в меру и зависит от конкретной задачи.

Вот как раз использование в коде const определений и их public static эквивалентов вместо #define совсем не зависит от задачи.

353
22 сентября 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
Вот как раз использование в коде const определений и их public static эквивалентов вместо #define совсем не зависит от задачи.


1) Ну я согу сделать с define константой (обычной константой), то что ты не сомжешь сделать с const... Иногда это полезно и удобно.
2) Насчет вне или внутри класса - это зависит от задачи и смысловой нагрузки константы.

Все зависит от задачи.

3
22 сентября 2008 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Опять одни догмы. Все хорошо в меру и зависит от конкретной задачи.


"Мойте руки перед едой" - тоже догма.
"Уступайте места старшим", "не чавкайте и не говорите с набитым ртом" - тоже догмы.
Однако, они формируют стиль.

Мне вот неприятно общаться с невоспитанным, неопрятным человеком.
Точно так же неприятно читать неопрятный код со свалкой переменных, констант и дефайнов.
Люблю, когда можно выдернуть класс из кода и вставить в другую программу (или тест) с минимальным шаманством и кишками. А любые глобальные вещи (дефайны по определению глобальные) затрудняют такие операции.

87
22 сентября 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: Nixus
1) Ну я согу сделать с define константой (обычной константой), то что ты не сомжешь сделать с const... Иногда это полезно и удобно.


Например?

353
22 сентября 2008 года
Nixus
840 / / 04.01.2007
Цитата: Kogrom
Например?


Грубый пример:

В заголовке:

 
Код:
#define VERSION "1.0.345a"


Где-то в коде
 
Код:
Renderer->TextOut(0, 0, "Version: " VERSION ", Build time: " BUILD_TIME);
5
22 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: Nixus
В заголовке:
 
Код:
#define VERSION "1.0.345a"
Где-то в коде
 
Код:
Renderer->TextOut(0, 0, "Version: " VERSION ", Build time: " BUILD_TIME);

И что тут такого неимоверно сложного?
Отсутствие оператора конкатенации строк? :D

353
22 сентября 2008 года
Nixus
840 / / 04.01.2007
Цитата: hardcase
И что тут такого неимоверно сложного?
Отсутствие оператора конкатенации строк? :D


Где я писал про сложность? Сделай то же самое, но с использованием const и переносимое в любую программу.

288
22 сентября 2008 года
nikitozz
1.2K / / 09.03.2007
По-моему мы начинаем сравнивать немного разные вещи. Ведь #define - это не только константы. Точнее, это не совсем константы. #define - это просто мощный инструмент для подстановки в исходный текст, который в ЧАСТНОСТИ можно, скажем, использовать для подстановки в текст числовых и строковых значений. Поэтому говорить о #define вообще, что это зло - по моему не очень правильно.
Как способ объявления констант - это далеко не лучший выбор. И при альтернативе объявить эту константу членом класса или нэймспейса(к которому она логически относится) или с помощью #define, выигрывает первый вариант.
Но не всегда такая альтернатива существует. Скажем в ситуациях, когда какое-то значение необходимо нам еще на этапе компиляции (предположим для объявления массива).
5
22 сентября 2008 года
hardcase
4.5K / / 09.08.2005
Цитата: nikitozz
Скажем в ситуациях, когда какое-то значение необходимо нам еще на этапе компиляции

#define не позволяет выполнять вычислений на этапе компиляции и позиционировать его как средство метапрограммирования - заблуждение.
Максимальная его возможность - подставить текст. Ключевое слово - текст. Макросы как элемент языка препроцессора не предполагают синтаксический и семантический анализ своего тела (а ведь мы имеем дело с текстом программы на формальном языке), и уж тем более не позволяют выполнять пользовательских compile-time вычислений.

[quote=Nixus]Сделай то же самое, но с использованием const и переносимое в любую программу. [/quote]Нафига мне макрос VERSION в каждой программе?

87
22 сентября 2008 года
Kogrom
2.7K / / 02.02.2008
Цитата: nikitozz
Но не всегда такая альтернатива существует. Скажем в ситуациях, когда какое-то значение необходимо нам еще на этапе компиляции (предположим для объявления массива).


Не понял. Ну объявите размер массива тоже константой. В чем подвох?

А Nixus мухлюет. В его примере скорее макрос, чем константа.
Поэтому я тоже смухлюю на его предложение сделать то же самое :)

Код:
int main()
{
    const int MASSIV_SIZE = 1000;
    int massiv[MASSIV_SIZE];
    massiv[MASSIV_SIZE - 1] = 999;
    const string VERSION = "1.111";
    const string DATA = "2008.09.22";
    const string OUT_STRING = "Version: " + VERSION + " Data: " + DATA;
    cout << OUT_STRING << endl;
    // или аналогично
    cout << string("Version: " + VERSION + " Data: " + DATA) << endl;

    return 0;
}
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог