Russian Qt Forum

Программирование => С/C++ => Тема начата: Alex_C от Апрель 11, 2012, 15:37



Название: Объявить константу в классе
Отправлено: Alex_C от Апрель 11, 2012, 15:37
Немного не в тему Qt, но в тему C++:
мне необходимо в объявлении класса объявить константу. Так правильно?
Код:
private:
    const static qreal D2R = 0.017453;


Название: Re: Объявить константу в классе
Отправлено: Bepec от Апрель 11, 2012, 15:38
А статик то зачем?


Название: Re: Объявить константу в классе
Отправлено: kambala от Апрель 11, 2012, 15:48
Немного не в тему Qt, но в тему C++:
мне необходимо в объявлении класса объявить константу. Так правильно?
Код:
private:
    const static qreal D2R = 0.017453;
для этого есть раздел С++.

инициализировать статики надо вне класса, например так:
Код
C++ (Qt)
// .h
class A
{
   static const qreal a;
};
 
// .cpp
const qreal A::a = 1.0; // вне всякого метода


Название: Re: Объявить константу в классе
Отправлено: GreatSnake от Апрель 11, 2012, 16:23
инициализировать статики надо вне класса
За исключением интегральных типов.


Название: Re: Объявить константу в классе
Отправлено: Nimbus от Апрель 11, 2012, 16:29
А статик то зачем?
Чтобы при создании объектов для неё не выделялась память каждый раз. Я тоже практикую такой подход :)


Название: Re: Объявить константу в классе
Отправлено: Igors от Апрель 11, 2012, 16:33
По ходу дела такой вопрос
Код
C++ (Qt)
class CTest {
..
static const double PI = 3.151529;
static const double D2R = 180 / PI;
};
 
Есть ли уверенность что PI будет инициализировано до D2R ?


Название: Re: Объявить константу в классе
Отправлено: GreatSnake от Апрель 11, 2012, 16:42
Есть ли уверенность что PI будет инициализировано до D2R ?
Хороший вопрос :)


Название: Re: Объявить константу в классе
Отправлено: Igors от Апрель 11, 2012, 16:45
Хороший вопрос :)
Ага  :) Из той же оперы
Код
C++ (Qt)
const double cos20 = cos(20 * 3.141529 / 180);
 
А так можно?


Название: Re: Объявить константу в классе
Отправлено: V1KT0P от Апрель 11, 2012, 16:49
По ходу дела такой вопрос
Код
C++ (Qt)
class CTest {
..
static const double PI = 3.151529;
static const double D2R = 180 / PI;
};
 
Есть ли уверенность что PI будет инициализировано до D2R ?
Есть вероятность что D2R будет посчитан еще на этапе компиляции.


Название: Re: Объявить константу в классе
Отправлено: GreatSnake от Апрель 11, 2012, 16:55
Есть вероятность что D2R будет посчитан еще на этапе компиляции.
Точно!


Название: Re: Объявить константу в классе
Отправлено: Igors от Апрель 11, 2012, 17:02
Есть вероятность что D2R будет посчитан еще на этапе компиляции.
Никто не спорит что такая вероятность есть - и даже велика  :) Но речь идет о "гарантиях" (а не о "вероятности"). Иногда надо быть нудным напр "а где в стандарте это написано"?


Название: Re: Объявить константу в классе
Отправлено: V1KT0P от Апрель 11, 2012, 17:11
Есть вероятность что D2R будет посчитан еще на этапе компиляции.
Никто не спорит что такая вероятность есть - и даже велика  :) Но речь идет о "гарантиях" (а не о "вероятности"). Иногда надо быть нудным напр "а где в стандарте это написано"?
Почитай документацию по тому компилятору который используешь =). Вот GCC например предупреждает, если в конструкторе переменные инициализируются не в том порядке в каком объявлены. Так что думаю с GCC проблем не будет.


Название: Re: Объявить константу в классе
Отправлено: GreatSnake от Апрель 11, 2012, 17:13
Вот GCC например предупреждает, если в конструкторе переменные инициализируются не в том порядке в каком объявлены. Так что думаю с GCC проблем не будет.
Имхо, это немного другое.


Название: Re: Объявить константу в классе
Отправлено: kambala от Апрель 11, 2012, 17:30
инициализировать статики надо вне класса
За исключением интегральных типов.
один раз (http://www.prog.org.ru/topic_17716_0.html) я уже пытался инициализировать целое прямо в месте объявления - потом долго не знал почему дебаг-сборка не хочет компилироваться. поэтому теперь все инициализирую вне класса.


Название: Re: Объявить константу в классе
Отправлено: Igors от Апрель 11, 2012, 17:32
Почитай документацию по тому компилятору который используешь =). Вот GCC например предупреждает, если в конструкторе переменные инициализируются не в том порядке в каком объявлены. Так что думаю с GCC проблем не будет.
Что-то не то Вы рекомендуете :)  Если это зависит от компилятора - то лучше такую конструкцию const не использовать и обойтись #define. Потому что только у меня 3 компилятора (gcc, icc и вындозный), а у других часто больше.

Здесь хорошо бы прильнуть к стандарту..


Название: Re: Объявить константу в классе
Отправлено: V1KT0P от Апрель 11, 2012, 17:41
Почитай документацию по тому компилятору который используешь =). Вот GCC например предупреждает, если в конструкторе переменные инициализируются не в том порядке в каком объявлены. Так что думаю с GCC проблем не будет.
Что-то не то Вы рекомендуете :)  Если это зависит от компилятора - то лучше такую конструкцию const не использовать и обойтись #define. Потому что только у меня 3 компилятора (gcc, icc и вындозный), а у других часто больше.

Здесь хорошо бы прильнуть к стандарту..
Дело в том что некоторые компиляторы могут иметь свои особенности и не до конца соответствовать стандарту.
А так качай стандарт и читай, вроде это то что надо:
Цитировать
12.6.2 Initializing bases and members


Название: Re: Объявить константу в классе
Отправлено: Igors от Апрель 12, 2012, 10:30
А так качай стандарт и читай, вроде это то что надо:
Цитировать
12.6.2 Initializing bases and members
Так а причем здесь базовые классы и члены класса?

В общем посмотрел я стандарт, понял так

- во всяком случае для интегрального типа с точки зрения инициализации нет разницы между глобальными, статическими переменными, статическими членами классов и константами. Все инициализируется однообразно как "non-local variable". В качестве присваиваемого значения могут использоваться любые переменные, выражения и константы объявленные ранее.

Итого
Код
C++ (Qt)
class CTest {
..
static const double PI = 3.151529;
static const double D2R = 180 / PI;
};
 
конструкция корректна и соответствует стандарту


Название: Re: Объявить константу в классе
Отправлено: twp от Апрель 20, 2012, 18:35
Цитировать
Prefer enums to define constants over static const int or defines.
    enum values will be replaced by the compiler at compile time, resulting in faster code
    defines are not namespace safe (and look ugly)
источник (http://qt-project.org/wiki/Coding-Conventions)


Название: Re: Объявить константу в классе
Отправлено: navrocky от Апрель 20, 2012, 19:37
Цитировать
Prefer enums to define constants over static const int or defines.
    enum values will be replaced by the compiler at compile time, resulting in faster code
    defines are not namespace safe (and look ugly)
источник (http://qt-project.org/wiki/Coding-Conventions)
К сожалению подходит только для целых чисел.