Здравствуйте, Аноним, Вы писали:
А>как объявить константу в классе?
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-ность использовать...
и просто ответ "как указатель на константное значение" — меня бы вполне устроил
Здравствуйте, <Аноним>, Вы писали:
А>как объявить константу в классе? А>мне нужно вот в таком вот виде:
А>
А>class A {
А> const int F = 123;
А>};
class A {
staticconst int F = 123;
};
А если компилятор такое не компилирует — выкиньте его и возмите нормальный .
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
А>>>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
MSVC 6.0 ф топку
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Здравствуйте, _DAle_, Вы писали:
_DA>Константные члены могут быть проинициализированы значениями, известными только в рантайме.
Happily, you don't have to care about any of this anymore. Fairly late in the standardization game, the C++ standards committee patched the C++ standard to let static integer constants be initialized in their declarations:
class X
{
public:
static int const n = 10; // initialization OKvoid f2()
{
int a[X::n]; // OK
}
};
int const X::n = 10; // now an error -- multiple initialization
int const X::n; // definition OK, but might not be required
Visual C++ .NET compiles this properly. Visual C++ 6.0 interprets the initialization of X::n as an illegal pure virtual function declaration
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth