#1 26.01.11 02:33
[C++] шаблоны
возник такой вопрос. например есть такой шаблон:
template <typename T>
class CSomeClass
{
public:
CSomeClass(void);
static int get_counter() { return counter; }; // получаем количество объектов класса
private:
static int counter; // счетчик объектов класса
// ну и другие методы и т.д.
};
template <typename T>
CSomeClass<T>::CSomeClass(void)
{ ++counter; };
template <typename T>
int CSomeClass<T>::counter = 0;
так вот, сколько бы я объектов не создавал, вызываю функцию get_counter() она упорно выдает ноль.
в чем ошибка?
и кстати тут же еще вопрос:
если я хочу объекты этого шаблона, причем с разными типа (ну там например double и wchar_t) хранить в ОДНОМ контейнере например vector, как это сделать?
как бы такое не канает же std::vector<CSomeClass<а вот тут надо написать какой тип!!!> >?
можно как нибудь извернуться?
через void* можно как-нибудь и собственно тут же вопрос, вообще что значит эта запись void*, можно объяснить популярно? прочитал что разыменование, но что означает конкретно так и не понял...
Исправлено Flinn (26.01.11 03:06)
Offline
#2 26.01.11 11:47
Re: [C++] шаблоны
шаблоны не решают твоей задачи "хранить в одном контейнере объекты разных типов"...
шаблоны предназначены как раз для реализации АТД для любого типа... т.е. ты например описываешь шаблон Vector<T>, который тебе позволяет создать вектор из int или вектор из double, но никак не вектор из разничных типов...
Offline
#4 26.01.11 12:01
Re: [C++] шаблоны
У меня есть шаблон для матриц различных типов. Так вот, допустим есть несколько объектов этого шаблона ну там парочка double'овских, и парочки int'овских. Вот интересовал вопрос, можно ли все это положить в один контейнер.
а по первому вопросу есть ответ? про static
Offline
#5 26.01.11 13:52
Re: [C++] шаблоны
ты не понимаешь назначения шаблонов... объекты не могут быть объектами шаблона... они являются объектами класса, с некоторыми изменяемыми частями, в зависимости от указанного типа... т.е. шаблоны придуманы для того, чтобы ты не писал 5 классов для хранения и обработки 5 различных типов данных, а мог это все объединить в виде шаблонного класса... не более того...
на счет статической переменной класса... накидай прям простой пример и покажи как ты это все пытаешь использовать... а то приходится додумывать... т.е. причина может крыться не только в описании... лично для мне запись
Код: cpp:
template <typename T> int CSomeClass<T>::counter = 0;
очень не очевидна... и куда ты такую запись пихаешь в своем проекте?
привильней наверное писать перед функцией main() что-то типа:
Код: cpp:
int CSomeClass<int>::counter = 0; int CSomeClass<double>::counter = 0;
т.е. для объектов с различными типами инициировать статический счетчик у конкретного класса
но и это вроде как можно реализовать в конструкторе класса (выделение памяти, задание начального значения), и не забыть в деструкторе при 0 высвобождать память
Исправлено Jaguar (26.01.11 14:00)
Offline
#7 26.01.11 16:05
Re: [C++] шаблоны
Я понимаю что такое шаблон и что такое класс.
вопрос был в том, можно ли в std::vector<CSomeClass<а вот тут надо написать какой тип!!!> > хранить шаблон с параметром <int> и одновременно с параметром <double>. Теперь понял что нет.
На сколько я понимаю можно делать только так:
std::vector<CSomeClass<int> > для int'ов и
std::vector<CSomeClass<double> > для double'ов. Верно?
Со статической переменной попробую как ты написал.
Offline
#8 26.01.11 16:13
Re: [C++] шаблоны
попробовал. Спс, сделал получилось. Кому если интересно вот так:
int CDynamicMatrix<int>::counter = 0;
int CDynamicMatrix<float>::counter = 0;
int CDynamicMatrix<double>::counter = 0;
int CDynamicMatrix<char>::counter = 0;
int CDynamicMatrix<wchar_t>::counter = 0;
для разных типов инициализировал свой счетчик.
ну и потом вызываю вот так:
CDynamicMatrix<double>::get_counter()
CDynamicMatrix<int>::get_counter()
то есть,Jaguar, я правильно понимаю, для каждого типа шаблона инициализировал свой счетчик, а потом для типов double и int вызвал функцию get_counter(). Верно?
Offline
#10 26.01.11 20:38
Re: [C++] шаблоны
Flinn написал(а):
вопрос был в том, можно ли в std::vector<CSomeClass<а вот тут надо написать какой тип!!!> > хранить шаблон с параметром <int> и одновременно с параметром <double>
нет, как я и писал выше... АТД vector из STL описан таким же шаблонным классом... следовательно не может содержать элементы разных типов.... ну, а тип элементов вектора может быть любым... даже свом (даже если реализован в виде шаблонного класса)
Offline

