тип static const int в классе, почему так выводит на экран?

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

Код: Выделить всё

#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?
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

P.S. Есть-ли какой-нибудь способ на этапе компиляции получать уникальные значения типа int?
Обычно используют перечислимый тип.

Код: Выделить всё

class First
{
public:
 enum
  {
    CLASS_ID = 1
  };
 int GetINTs() const
  {
    return CLASS_ID;
  }
};
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

почему second::INT ноль выводит, а three::INT выводит "3" ?
почему case не работают - ведь, тип const int ? чего компилятору не хватает для полного счастья?
second::INT и three::INT не проинициализированы константными значениями, как в случае first::INT
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

Почему не проинициализированы? у них ведь тип const int !

Цитата:
Обычно используют перечислимый тип.

я хочу получить уникальный идентификатор так:

class second
{
public:
static const int GetINTs()
{
static const int dummy = 123;
return (int)&dummy ;
}

};
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Если ты хочешь, чтобы у каждого класса был свой числовой идентификатор типа, то проще описать глобальный перечислитель типов, а каждый класс в методе 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-констант.

Иначе непонятно, зачем тогда вообще тебе указатель на статический элемент класса в качестве целого числа. Что ты с ним потом будешь делать?
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

значение указателя используется только лишь в качестве получения автоматического значения уникального идентификатора на этапе компиляции.
Аватара пользователя
WinMain
Сообщения: 929
Зарегистрирован: 14 янв 2005, 10:30
Откуда: Москва
Контактная информация:

Ты никак не получишь значение указателя на этапе компиляции.
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

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;
}
Lev
Сообщения: 45
Зарегистрирован: 14 фев 2005, 11:17

есть ли такие функции, которые можно пометить как то специально, вследствие чего компилятор по этой метке выполнял бы их на этапе компиляции?

например:

compille_time int GetFour()
{
return 4;
}
Absurd
Сообщения: 1228
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

Lev писал(а):есть ли такие функции, которые можно пометить как то специально, вследствие чего компилятор по этой метке выполнял бы их на этапе компиляции?
Вам сюда.

http://www.codeproject.com/cpp/crc_meta.asp
Как видно, это делается через enum
2B OR NOT(2B) = FF
Ответить