Константа класса CFoo
От: Максим Украина http://members.rogers.com/amdmax/
Дата: 26.10.03 14:43
Оценка:
Есть некий класс CFoo. Хочу создать константу, как одно из свойств данного класса. Т.е. примерно так:
class CFoo
{
public:
static const double PI=3.1415; // Вот здесь вот и не работает
}
// Продолжение класса можно опустить. Там есть конструктор, деструктор и т.п.
Можно конечно объявить Pi как свойство. Но хочется сделать именно Паблик константу.
Заранее благодарен.
Re: Константа класса CFoo
От: Зверёк Харьковский  
Дата: 26.10.03 15:00
Оценка:
Здравствуйте, Максим, Вы писали:

М>Есть некий класс CFoo. Хочу создать константу, как одно из свойств данного класса. Т.е. примерно так:

//в .h-нике
М>class CFoo
М>{
М>public:
М>    static const double PI;М>}

//в соотв. .срр-шнике
const double PI = 3.14159;


обращаю ваше внимание на то, что именно в cpp-шнике, если это в h-нике сделать, линкер некрасиво заматерится
FAQ — це мiй ай-кью!
Re: Константа класса CFoo
От: PM  
Дата: 26.10.03 15:06
Оценка:
Здраствуйте, Максим. Вы писали:

М> Есть некий класс CFoo. Хочу создать константу, как одно из свойств

М> данного класса. Т.е. примерно так: class CFoo
М> {
М> public:
М> static const double PI=3.1415; // Вот здесь вот и не работает
М> }
М> // Продолжение класса можно опустить. Там есть конструктор, деструктор и
М> т.п. Можно конечно объявить Pi как свойство. Но хочется сделать именно
М> Паблик константу. Заранее благодарен.
Инициализация констант в объявлении класса допустима только для интегральных типов
Posted via RSDN NNTP Server 1.7 "Bedlam"
Re[2]: Константа класса CFoo
От: achp  
Дата: 26.10.03 15:09
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>
ЗХ>//в .h-нике
М>>class CFoo
М>>{
М>>public:
М>>    static const double PI;М>}

ЗХ>//в соотв. .срр-шнике
ЗХ>const double CFoo::PI = 3.14159;
ЗХ>
Re[3]: Константа класса CFoo
От: Зверёк Харьковский  
Дата: 26.10.03 15:16
Оценка:
Здравствуйте, achp, Вы писали:

A>Здравствуйте, Зверёк Харьковский, Вы писали:


ЗХ>>
ЗХ>>//в .h-нике
М>>>class CFoo
М>>>{
М>>>public:
М>>>    static const double PI;М>}

ЗХ>>//в соотв. .срр-шнике
ЗХ>>const double CFoo::PI = 3.14159;
ЗХ>>


не бейте по голове, это очепятка (точнее, результат Ctrl+C — Ctrl+V )
FAQ — це мiй ай-кью!
Re[2]: Константа класса CFoo
От: Аноним  
Дата: 26.10.03 15:36
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

<...>

ЗХ>обращаю ваше внимание на то, что именно в cpp-шнике, если это в h-нике сделать, линкер некрасиво заматерится


Его можно заматерить, если использовать __declspec(selectany).
Re[3]: Константа класса CFoo
От: Зверёк Харьковский  
Дата: 26.10.03 15:40
Оценка:
Здравствуйте, Аноним, Вы писали:

ЗХ>>обращаю ваше внимание на то, что именно в cpp-шнике, если это в h-нике сделать, линкер некрасиво заматерится


А>Его можно заматерить, если использовать __declspec(selectany).


занятно.. а это не [КТО-НИБУДЬ] СПЕЦИФИК ?
FAQ — це мiй ай-кью!
Re[4]: Константа класса CFoo
От: achp  
Дата: 26.10.03 15:43
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>занятно.. а это не [КТО-НИБУДЬ] СПЕЦИФИК ?


Именно. Двойное подчеркивание в __declspec должно навести на эту мысль.
Re: Константа класса CFoo
От: Шахтер Интернет  
Дата: 26.10.03 20:17
Оценка: 12 (2)
Текущий стандарт C++ не допускает явной инициализации констант плавающего типа в объявлении класса. Не понимаю почему.
Надеюсь, что это будет исправлено. А пока можно делать так .

/* main.cpp */

#include <iostream>

using namespace std;

/* struct Test */

struct Test
{
static const struct { operator double() const { return 3.14159; } } pi;
};

/* main() */

int main()
{
cout << "Test::pi=" << Test::pi << endl ;

return 0;
}

Фрагмент main.asm (VC++ 7.1)

; 18 : cout << "Test::pi=" << Test::pi << endl ;

fld QWORD PTR __real@400921f9f01b866e
push esi
sub esp, 8
fstp QWORD PTR [esp]
push OFFSET FLAT:??_C@_09IICHILHK@Test?3?3pi?$DN?$AA@
push OFFSET FLAT:?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A ; std::cout
call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> >
add esp, 8
mov ecx, eax
call ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z ; std::basic_ostream<char,std::char_traits<char> >::operator<<
mov esi, eax
push 10 ; 0000000aH
mov ecx, esi
call ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z ; std::basic_ostream<char,std::char_traits<char> >::put
mov ecx, esi
call ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ ; std::basic_ostream<char,std::char_traits<char> >::flush
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.