Здравствуйте, Аноним, Вы писали:
А>как объявить константу в классе?
class A {
const int F /* = 123 */; // это - константная переменная-членstatic const int G = 123; // вот так правильно... (старые компиляторы будут ругаться)static const int H; // это - константная переменная - статический член (требует отдельной инициализации)enum { I = 123 }; // ещё можно делать вот так
A() : F(123) {} // константы-члены нужно инициализировать в конструкторе
A(int x) : F(x*2) {} // причём в разных конструкторах - можно по-разному
};
// где-то в недрах .cppconst int A::H = 123;
Перекуём баги на фичи!
Re[2]: константа в классе
От:
Аноним
Дата:
12.09.05 07:56
Оценка:
Здравствуйте, Chelovek_, Вы писали:
C_> Может вот так:
А>>
А>>class A {
А>> static const int F = 123;
А>>};
А>>
: error C2258: illegal pure syntax, must be '= 0'
: error C2252: 'F' : pure specifier can only be specified for functions
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>как объявить константу в классе? А>>
А>>class A {
А>> const int F /* = 123 */; // это - константная переменная-член
К> static const int G = 123; // вот так правильно... (старые компиляторы будут ругаться)
К> static const int H; // это - константная переменная - статический член (требует отдельной инициализации)
К> enum { I = 123 }; // ещё можно делать вот так
К> A() : F(123) {} // константы-члены нужно инициализировать в конструкторе
К> A(int x) : F(x*2) {} // причём в разных конструкторах - можно по-разному
А>>};
К>// где-то в недрах .cpp
К>const int A::H = 123;
А>>
спасибо большое!
правда, у меня (ms vs 6.0) сработал пример только с F. Как раз то, что нужно
получается, константной переменной-члену можно дать значение только в списке инициализаторов?
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, dyattle, Вы писали:
D>>>Здравствуйте, Аноним, Вы писали:
D>>>А так не пойдёт?
D>>>
D>>>class A
D>>>{
D>>> enum
D>>> {
D>>> F = 123
D>>> };
D>>>};
D>>>
А>>да как раз так я и привык делать А>>но требуется именно константа... const
Ovl>нужно слово const или чтобы переменная была неизменяемой?
Константные члены могут быть проинициализированы значениями, известными только в рантайме. Да и значения перечислений не являются lvalue.
Здравствуйте, _DAle_, Вы писали:
Ovl>>нужно слово const или чтобы переменная была неизменяемой?
_DA>Константные члены могут быть проинициализированы значениями, известными только в рантайме.
может. но про это разговора не было
_DA>Да и значения перечислений не являются lvalue.
а разве константа, которой добивается автор, будет являеться lvalue?
Здравствуйте, Ovl, Вы писали:
_DA>>Да и значения перечислений не являются lvalue. Ovl>а разве константа, которой добивается автор, будет являеться lvalue?
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Ovl, Вы писали:
_DA>>>Да и значения перечислений не являются lvalue. Ovl>>а разве константа, которой добивается автор, будет являеться lvalue?
_DA>Да.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, _DAle_, Вы писали:
_DA>>Здравствуйте, Ovl, Вы писали:
_DA>>>>Да и значения перечислений не являются lvalue. Ovl>>>а разве константа, которой добивается автор, будет являеться lvalue?
_DA>>Да.
Ovl>можно пример когда константа является lvalue?
Здравствуйте, Ellin, Вы писали:
E>Здравствуйте, _DAle_, Вы писали: _DA>>Константные члены могут быть проинициализированы значениями, известными только в рантайме. E>А как с этим быть? E>
К>>// в .срр файле
К>>const int Test::val = 33;
А>>>
E>
Немного не понял к чему вопрос. Но в любом случае для такой инициализации необходимо, чтобы val был статической константой.
Здравствуйте, _DAle_, Вы писали:
_DA>Здравствуйте, Ovl, Вы писали:
Ovl>>Здравствуйте, _DAle_, Вы писали:
_DA>>>Здравствуйте, Ovl, Вы писали:
_DA>>>>>Да и значения перечислений не являются lvalue. Ovl>>>>а разве константа, которой добивается автор, будет являеться lvalue?
_DA>>>Да.
Ovl>>можно пример когда константа является lvalue?
_DA>Не пример, но статья, объясняющая возможные непонятки http://www.rsdn.ru/article/cpp/lvalue.xml
я имел ввиду, что константа не может быть lvalue без использования const_cast (чье использование мне не кажется хорошим тоном).
imho, аргумент, что константу иногда требуется изменить противоречит самому использованию константы.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, _DAle_, Вы писали:
_DA>>Здравствуйте, Ovl, Вы писали:
Ovl>>>Здравствуйте, _DAle_, Вы писали:
_DA>>>>Здравствуйте, Ovl, Вы писали:
_DA>>>>>>Да и значения перечислений не являются lvalue. Ovl>>>>>а разве константа, которой добивается автор, будет являеться lvalue?
_DA>>>>Да.
Ovl>>>можно пример когда константа является lvalue?
_DA>>Не пример, но статья, объясняющая возможные непонятки http://www.rsdn.ru/article/cpp/lvalue.xml
Ovl>я имел ввиду, что константа не может быть lvalue без использования const_cast (чье использование мне не кажется хорошим тоном). Ovl>imho, аргумент, что константу иногда требуется изменить противоречит самому использованию константы.
Я же дал ссылку, почитай, пожалуйста, что такое lvalue в с++. Изменение значения константы тут не при чем.
Здравствуйте, Ovl, Вы писали:
Ovl>Здравствуйте, _DAle_, Вы писали:
_DA>>Здравствуйте, Ovl, Вы писали:
Ovl>>>Здравствуйте, _DAle_, Вы писали:
_DA>>>>Здравствуйте, Ovl, Вы писали:
_DA>>>>>>Да и значения перечислений не являются lvalue. Ovl>>>>>а разве константа, которой добивается автор, будет являеться lvalue?
_DA>>>>Да.
Ovl>>>можно пример когда константа является lvalue?
_DA>>Не пример, но статья, объясняющая возможные непонятки http://www.rsdn.ru/article/cpp/lvalue.xml
Ovl>я имел ввиду, что константа не может быть lvalue без использования const_cast (чье использование мне не кажется хорошим тоном). Ovl>imho, аргумент, что константу иногда требуется изменить противоречит самому использованию константы.
пропустил параграф. если пользоваться нужен указатель на константу, то тогда действительно enum не катит
Здравствуйте, Ovl, Вы писали:
Ovl>>>можно пример когда константа является lvalue?
_DA>>Не пример, но статья, объясняющая возможные непонятки http://www.rsdn.ru/article/cpp/lvalue.xml
Ovl>я имел ввиду, что константа не может быть lvalue без использования const_cast (чье использование мне не кажется хорошим тоном). Ovl>imho, аргумент, что константу иногда требуется изменить противоречит самому использованию константы.
const_cast необязателен, чтобы продемонстрировать lvalue'ность.
enum SomeEnum { some_rvalue = 123 };
const int some_const_lvalue = 123;
const SomeEnum* pe = &some_enum; // агащаз - error: expression must be an lvalue or a function designatorconst int* pi = &some_const_lvalue; // всё в порядке
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Ovl, Вы писали:
Ovl>>>>можно пример когда константа является lvalue?
_DA>>>Не пример, но статья, объясняющая возможные непонятки http://www.rsdn.ru/article/cpp/lvalue.xml
Ovl>>я имел ввиду, что константа не может быть lvalue без использования const_cast (чье использование мне не кажется хорошим тоном). Ovl>>imho, аргумент, что константу иногда требуется изменить противоречит самому использованию константы.
К>const_cast необязателен, чтобы продемонстрировать lvalue'ность. К>
К>enum SomeEnum { some_rvalue = 123 };
К>const int some_const_lvalue = 123;
К>const SomeEnum* pe = &some_enum; // имелось ввиду some_rvalue?
К>const int* pi = &some_const_lvalue; // всё в порядке
К>
если бы вопрос был только является ли элемент enum lvalue — то ответ можно посмотреть в конце статьи.
но у меня вопрос был как эту lval-ность использовать...
и просто ответ "как указатель на константное значение" — меня бы вполне устроил