Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Статические переменные в шаблонных классах  (Прочитано 8007 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« : 24-11-2010 22:06 » 

Доброй ночи!
Помогите, пожалуйста, правильно ли это:
Код:
template<typename T>
class foo
{
public:
    static int Stat;
};
1) будет существовать отдельно статическая переменная foo<T>::Stat, а также для каждого конкретного типа своя (например, foo<int>::Stat, foo<double>::Stat и т. д.);
2) при создании обьекта foo<int> значение foo<int>::Stat будет инициализировано значением foo<T>::Stat.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 24-11-2010 22:26 » 

Вот код
Код:
#include <stdio.h>

template<typename T>
class foo
{
public:
    static int Stat;
};
template<typename T>
int foo<T>::Stat=0;

int main() {
foo<int> a;
printf("%d\n", a.Stat);
foo<double> b;
printf("%d\n", b.Stat);
foo<int> c;
printf("%d\n", c.Stat);
b.Stat=1;
c.Stat=3;
printf("%d\n", a.Stat);
printf("%d\n", b.Stat);
printf("%d\n", c.Stat);

   return 0;
}
Вот вывод на печать
0
0
0
3
1
3
Выводы делай сам.
« Последнее редактирование: 24-11-2010 22:33 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #2 : 24-11-2010 22:36 » 

Спасибо! =)

З.Ы. foo<T>::Stat - моя непростительная ошибка.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 25-11-2010 08:56 » new

Доброй ночи!
Помогите, пожалуйста, правильно ли это:
1) будет существовать отдельно статическая переменная foo<T>::Stat, а также для каждого конкретного типа своя (например, foo<int>::Stat, foo<double>::Stat и т. д.);
2) при создании обьекта foo<int> значение foo<int>::Stat будет инициализировано значением foo<T>::Stat.
Ваш шаблон объявил статическую переменную, но не определил её. Статическая переменная будет существовать только при условии её определения в .cpp файле. Статическая переменная будет инициализирована именно в точке определения.

Если хочется "магии" - чтобы статическая переменная определялась автоматически, можно использовать такой прием:
Код:
template<typename T>
class foo
{
public:
    static inline int& stat() { static int _storage; return _storage; }
};
Недостаток этого приема: вместо переменной используется функция. Например
Код:
 foo<T>::stat() = 10; 
Но этот недостаток, на мой взгляд, компенсируется тем, что не нужно явно определять статическую переменную при инстанциировании шаблона.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines