Читаем Язык программирования C++. Пятое издание полностью

// в другом месте программы

extern template class Blob;

extern template int compare(const int&, const int&);

Blob sa1, sa2; // экземпляр создается в другом месте

// экземпляры Blob и его конструктор initializer_list создаются

// в этом файле

Blob a1 = {0,1,2,3,4,5,6,7,8,9};

Blob a2(a1); // экземпляр конструктора копий

                  // создается в этом файле

int i = compare(a1[0], а2[0]); // экземпляр создается в другом месте

Файл Application.o будет создавать экземпляр класса Blob наряду с его конструктором initializer_list и конструктором копий. Экземпляры функции compare и класса Blob не будут созданы в этом файле. Определения этих шаблонов должны быть в каком-то другом файле программы:

// templateBuild.cc

// файл создания экземпляра должен предоставить обычное определение для

// каждого типа и функции, которые другие файлы объявляют внешними

template int compare(const int&, const int&);

template class Blob; // создает экземпляры всех членов

                             // шаблона класса

В отличие от объявления, когда компилятор видит определение экземпляра, он создает код. Таким образом, файл templateBuild.o будет содержать определения функции compare() для экземпляра типа int и класса Blob. При построении приложения следует скомпоновать файл templateBuild.o с файлом Application.o.

Для каждого объявления экземпляра где-нибудь в программе должно быть определение явного создания экземпляра.

Определения экземпляров создают экземпляры всех членов

Определение экземпляра для шаблона класса создает экземпляры всех членов этого шаблона, включая встраиваемые функции-члены. Когда компилятор видит определение экземпляра, он не может знать, какие функции-члены использует программа. Следовательно, в отличие от обычного способа создания экземпляра шаблона класса, компилятор создает экземпляры всех членов этого класса. Даже если член класса не будет использоваться, его экземпляр будет создан все равно. Следовательно, явное создание экземпляра можно использовать только для таких типов, которые применимы со всеми членами данного шаблона.

Определение экземпляра используется только для таких типов, которые применимы со всеми функциями-членами шаблона класса.

Упражнения раздела 16.1.5

Упражнение 16.25. Объясните значение этих объявлений:

extern template class vector;

template class vector;

Упражнение 16.26. Предположим, что класс NoDefault не имеет стандартного конструктора. Можно ли явно создать экземпляр vector? Если нет, то почему?

Упражнение 16.27. Объясните по каждому помеченному оператору, происходит ли создание экземпляра. Если создается экземпляр шаблона, объясните, почему; если нет, то тоже почему.

template class Stack { };

void f1(Stack);              // (a)

class Exercise {

 Stack &rsd               // (b)

 Stack si;                    // (c)

};

int main() {

 Stack *sc;                  // (d)

 f1(*sc);                          // (e)

 int iObj = sizeof(Stack); // (f)

}

<p><image l:href="#books.png"/>16.1.6. Эффективность и гибкость</p>

Библиотечные типы интеллектуальных указателей (см. раздел 12.1) являются хорошим примером грамотно спроектированных шаблонов.

Очевидное различие между указателями shared_ptr и unique_ptr в стратегии, которую они используют для управления содержащимися в них указателями: один класс предоставляет совместную собственность; а другой — единоличною собственность на хранимый указатель. Это различие и является основанием для создания данных классов.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных