Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lections_rus.doc
Скачиваний:
31
Добавлен:
06.02.2016
Размер:
1.41 Mб
Скачать

12.3. Размещение определений шаблонов в многомодульных программах

При размещении определений шаблонов возможны два варианта:

- если используется компилятор в интегрированной среде, запус­каемый в диалоговом окне, используйте:

Options->Copmpiler->C++options...->Template Generation;

- (наиболее удобный) поместите тело функции (в случае шаблона функции) или определения функций-членов и статических данных (в случае шаблона класса) в заголовочный файл, который следует вклю­чать во все модули проекта, где используется данный шаблон, и уста­новить режим компиляции Smart.

12.4. Полиморфные вектора

У вас есть другая возможность - определить ваш векторный и другие вмещающие классы через указатели на объекты некоторого класса:

class common

//...

;

class vector

{

common** v;

//...

public:

cvector(int);

common*& elem(int);

common*& operator[](int);

//...

};

Заметьте, что поскольку в таких векторах хранятся указатели, а не сами объекты, объект может быть "в" нескольких таких векторах од­новременно. Это очень полезное свойство подобных вмещающих классов, таких, как вектора, связанные списки, множества и т.д. Кроме того, можно присваивать указатель на производный класс указателю на его базовый класс, поэтому можно использовать приведенный выше cvector для хранения указателей на объекты всех производных от common клас­сов. Например:

class apple : public common /*...*/

class orange : public common /*...*/

class apple_vector : public cvector

{

public:

cvector fruitbowl(100);

//...

apple aa;

orange oo;

//...

fruitbowl[0] = &aa;

fruitbowl[1] = &oo;

}

Однако, точный тип объекта, вошедшего в такой вмещающий класс, больше компилятору не известен. Например, в предыдущем примере вы знаете, что элемент вектора является common, но является он apple или orange? Обычно точный тип должен впоследствие быть восстанов­лен, чтобы обеспечить правильное использование объекта. Для этого нужно или в какой-то форме хранить информацию о типе в самом объек­те, или обеспечить, чтобы во вмещающий класс помещались только объ­екты данного типа. Последнее легко достигается с помощью производ­ного класса. Вы можете, например, создать вектор указателей на apple:

class apple_vector : public cvector

{

public:

apple*& elem(int i)

return (apple*&) cvector::elem(i);

//...

};

используя запись приведения к типу (тип)выражение, чтобы преобразо­вать common*& (ссылку на указатель на common), которую возвращает cvector::elem, в apple*&. Такое применение производных классов соз­дает альтернативу обобщенным классам. Писать его немного труднее (если не использовать макросы таким образом, чтобы производные классы фактически реализовывали обобщенные классы; см. #7.3.5), но оно имеет то преимущество, что все производные классы совместно ис­пользуют единственную копию функции базового класса. В случае обоб­щенных классов, таких, как vector(type), для каждого нового исполь­зуемого типа должна создаваться (с помощью implement()) новая копия таких функций. Другой способ, хранение идентификации типа в каждом объекте, приводит нас к стилю программирования, который часто назы­вают объекто-основанным или объектно-ориентированным.

ТЕМА 13. ВИДИМОСТЬ ЭЛЕМЕНТОВ В С++.СТАТИЧЕСКАЯ И СВОБОДНАЯ ПАМЯТЬ(2 часа).

В этой главе обсуждаются два важных вопроса, касающиеся объявлений в С++. Где употребляется объявленное имя? Когда можно безопасно использовать объект или вызывать функцию, т.е. каково время жизни сущности в программе? Для ответа на первый вопрос мы введем понятие областей видимости и покажем, как они ограничивают применение имен в исходном файле программы. Мы рассмотрим разные типы таких областей: глобальную и локальную, а также более сложное понятие областей видимости пространств имен, которое появится в конце главы. Отвечая на второй вопрос, мы опишем, как объявления вводят глобальные объекты и функции (сущности, “живущие” в течение всего времени работы программы), локальные (“живущие” на определенном отрезке выполнения) и динамически размещаемые объекты (временем жизни которых управляет программист). Мы также исследуем свойства времени выполнения, характерные для этих объектов и функций.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]