![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Наверное, модератор меня уже не любит. За 2 дня 3 вопрос по шаблонам. Читаю книгу Либерти "С++ за 21 день".
На этот раз, надеюсь в последний, такая проблема. Использование специализированного конструктора класса шаблона. template <class T> Array<T>::Array(int size) : itsSize(size) { pType = new T[size]; for(int i = 0; i < size; i++) pType[i] = 0; в этом месте неявно size раз вызывается конструктор класса Т при создании шаблона Но для некоторых классов инициализация происходит на этапе pType = new T[size] (зависит от конструктора класса). Чтобы этот процесс оптимизировать, Либерти приводит такое решение для конкретного класса Array<Animal>::Array(int AnimalSize) : itsSize(AnimalSize) { pType = new Animal[AnimalSize]; } Ни в Builder 6, ни в visual 6 и 2005 программа не работает. Хотел было плюнуть, но очень хочется разобраться код
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Kuvaldis,
Данная специализация должна быть до main |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
1. Daevaorn, спасибо за ответ. Наберу 100 постов, добавлю тебе репутацию.
2. Получается, что если у меня шаблон описан в отдельном header-файле, а класс Animal в головном cpp, то специализацию придется описывать в головном cpp? -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Я что-то не пойму, зачем в конструктор шаблона зашивать инициализацию, более логично сделать для этого отдельную фукцию примерно так:
При этом в конструкторе шаблона вызывается конструктор класса T без параметров, а в функции init инициализируется конкретным значением, или в данном примере речь идет не о том? |
|||
|
||||
Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Athlon, проблема в том, что если у нас создается шаблонный класс Array, по умолчанию инициализирующийся нулями. Это происходит в цикле. Но для текоторых классов параметров (например, для Animal, данный цикл излишний, так как ницициализация нужная происходит во время создания массива в памяти (через конструктор класса Animal)
pType = new T[size]; а в цикле идет pType = 0. Это равносильно pType = (T) 0; Но что значит Animal = 0? itsWeight = 0; Что делается до этого конструктором. Именно для оптимизации данной ситуации и нужен спец. конструктор (извини за сумбурный ответ) -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
Athlon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 15.1.2006 Где: Украина:: Запорож ье Репутация: нет Всего: нет |
Дык я о том и говорю - пусть в конструкторе шаблона вызывается конструктор без аргументов класса T (Animal), а если нужно инициализировать весь массив конкретным значением, то делать это нужно отдельной функой, например init (см. предидущий пост). А для того чтобы init нормально работала, нужно чтобы у внутренего класса (T или Animal) был перегружен оператор присваивания(если генерируемый компилятором не годится).
Т.е я хочу сказать, что шаблон должен быть максимально универсальным, а если его нужно подстраивать под каждый класс, то зачем такой шаблон нужен? Надеюсь понятна моя точка зрения ![]() |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
в том то и дело, что шаблон универсален и есть одно исключение для Animal для чего по-твоему частичная/полная специализация шаблона нужна? -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |