Страница 1 из 2
тип static const int в классе, почему так выводит на экран?
Добавлено: 12 мар 2006, 18:07
Lev
Код: Выделить всё
#include <iostream>
class first
{
public :
static const int GetINTs()
{
return 1;
}
static const int INT = 1;
};
class second
{
public:
static const int GetINTs()
{
return 2;
}
static const int INT = GetINTs();
};
class three
{
public:
static const int GetINTs()
{
return 3;
}
static const int INT;
};
const int three::INT = GetINTs();
int main()
{
std::cout << "first::GetINTs() = " << first::GetINTs() << "\n";
std::cout << "first::INT = " << first::INT << "\n\n";
std::cout << "second::GetINTs() = " << second::GetINTs() << "\n";
std::cout << "second::INT = " << second::INT << "\n\n"; // zero ?
std::cout << "three::GetINTs() = " << three::GetINTs() << "\n";
std::cout << "three::INT = " << three::INT << "\n\n"; // now 3 ?
int sw = 5;
switch(sw)
{
case first::INT: // no problem
std::cout << "first::INT selected \n";
break;
//case second::INT: // error C2051: case expression not constant
std::cout << "second::INT selected \n";
break;
//case three::INT: // error C2051: case expression not constant
std::cout << "three::INT selected \n";
break;
default :
std::cout << "default selected \n";
}
return 0;
}
выводит на экран:
first::GetINTs() = 1
first::INT = 1
second::GetINTs() = 2
second::INT = 0
three::GetINTs() = 3
three::INT = 3
default selected
Вопросы:
почему second::INT ноль выводит, а three::INT выводит "3" ?
почему case не работают - ведь, тип const int ? чего компилятору не хватает для полного счастья?
Необходимо именно switch применять.
компилятор VC 7.1
P.S. Есть-ли какой-нибудь способ на этапе компиляции получать уникальные значения типа int?
Добавлено: 13 мар 2006, 10:44
WinMain
P.S. Есть-ли какой-нибудь способ на этапе компиляции получать уникальные значения типа int?
Обычно используют перечислимый тип.
Код: Выделить всё
class First
{
public:
enum
{
CLASS_ID = 1
};
int GetINTs() const
{
return CLASS_ID;
}
};
Добавлено: 13 мар 2006, 12:24
WinMain
почему second::INT ноль выводит, а three::INT выводит "3" ?
почему case не работают - ведь, тип const int ? чего компилятору не хватает для полного счастья?
second::INT и three::INT не проинициализированы константными значениями, как в случае first::INT
Добавлено: 13 мар 2006, 12:34
Lev
Почему не проинициализированы? у них ведь тип const int !
Цитата:
Обычно используют перечислимый тип.
я хочу получить уникальный идентификатор так:
class second
{
public:
static const int GetINTs()
{
static const int dummy = 123;
return (int)&dummy ;
}
};
Добавлено: 13 мар 2006, 14:11
WinMain
Если ты хочешь, чтобы у каждого класса был свой числовой идентификатор типа, то проще описать глобальный перечислитель типов, а каждый класс в методе GetINTs() будет возвращать соответствующий ему идентификатор из этого перечисления.
Код: Выделить всё
enum CLASS_TYPE_ID
{
CLASS_NULL,
CLASS_FIRST,
CLASS_SECOND,
CLASS_THIRD
};
class First
{
public:
static int GetINTs()
{
return CLASS_FIRST;
}
};
class Second
{
public:
static int GetINTs()
{
return CLASS_SECOND;
}
};
Элементы перечисления сможешь потом использовать в операторе switch в качестве case-констант.
Иначе непонятно, зачем тогда вообще тебе указатель на статический элемент класса в качестве целого числа. Что ты с ним потом будешь делать?
Добавлено: 13 мар 2006, 16:14
Lev
значение указателя используется только лишь в качестве получения автоматического значения уникального идентификатора на этапе компиляции.
Добавлено: 13 мар 2006, 16:20
WinMain
Ты никак не получишь значение указателя на этапе компиляции.
Добавлено: 14 мар 2006, 08:54
Lev
WinMain писал(а):Ты никак не получишь значение указателя на этапе компиляции.
а что выводит эта программа?
#include <iostream>
class base
{
public:
static const int GetINTs()
{
static const int tt = 0;
return (int)&tt;
}
const int m_INT;
};
int main()
{
std::cout << base::GetINTs() << "\n";
return 0;
}
Добавлено: 14 мар 2006, 08:58
Lev
есть ли такие функции, которые можно пометить как то специально, вследствие чего компилятор по этой метке выполнял бы их на этапе компиляции?
например:
compille_time int GetFour()
{
return 4;
}
Добавлено: 14 мар 2006, 11:06
Absurd
Lev писал(а):есть ли такие функции, которые можно пометить как то специально, вследствие чего компилятор по этой метке выполнял бы их на этапе компиляции?
Вам сюда.
http://www.codeproject.com/cpp/crc_meta.asp
Как видно, это делается через enum