Программирование >>  Инициализация объектов класса, структура 

1 ... 19 20 21 [ 22 ] 23 24 25 ... 395


Пространство имен IBM Canada Laboratory становится видим1м в программе. Mожно сделать видимым не все пространство, а отдельные имена внутри него (селективная директива using):

#include IBM Canada Laboratory.h

using namespace IBM Canada Laboratory::Matrix; видим становится только Matrix

int main() {

IBM Canada Laboratory::Matrix

Matrix mat(4,4);

Сшибка: IBM Canada Laboratory::Array невидим Array<int> ia(1024);

...

Как мы уже упоминали, все компоненты стандартной библиотеки С++ объявлены внутри пространства имен std. Поэтому простого включения заголовочного файла недостаточно, чтобы напрямую пользоваться стандартными функциями и классами:

#include <string>

ошибка: string невидим string current chapter = Сбзор С++ ;

Конечно, чтобы это стало возможным, необходимо точное совпадение интерфейсов классов и функций, объявленных в этих пространствах имен. Представим, что класс Array из Disney Feature Animiation не имеет конструктора с одним параметром -размером. Тогда следующий код вызовет ошибку:

namespace LIB = Disney Feature A\nimation;

int main() {

LIB::Array<int> ia(1024);

Еще более удобным является способ использования простого, неквалифицированного имени для обращения к объектам, определенным в некотором пространстве имен. Для этого существует директива using:

#include IBM Canada Laboratory.h

using namespace IBM Canada Laboratory;

int main() {

IBM Canada Laboratory::Matrix Matrix mat(4,4);

IBM Canada Laboratory::Array Array<int> ia(1024);

...



#include <string>

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

правильно: квафицированное имя std::string current chapter = Обзор С++ ; либо селективную директиву using: #include <string> using namespace std::string;

Ok: string видим

string current chapter = Обзор С++ ; Мы рекомендуем пользоваться последним способом.

В большинстве примеров этой книги директивы пространств имен были опущены. Это сделано ради сокращения размера кода, а также потому, что большинство примеров были скомпилированы компилятором, не поддерживающим пространства имен - достаточно недавнего нововведения С++. (Детали применения using-объявлений при работе с стандартной библиотекой С++ обсуждаются в разделе 8.6.)

В нижеследующих главах мы создадим еще четыре класса: String, Stack, List и модификацию Stack. Все они будут заключены в одно пространство имен -Cplusplus Primer 3E. (Более подробно работа с пространствами имен рассматривается в главе 8.)

Упражнение 2.21

namespace Exercize {

Дано пространство имен

template <class elemType> class Array { ... };

template <class EType> void print (Array< E

EType > );

class String { ... } template <class ListType> class List { ... };

и текст программы:

Необходимо использовать директиву using: #include <string> using namespace std;

Ok: видим string

string current chapter = Обзор С++ ;

Заметим, однако, что таким образом м1 возвращаемся к проблеме засорения глобального пространства имен, ради решения которой и был создан механизм



int main() {

const int size = 1024; A\rray<String> as (size);

List<int> il (size);

...

Array<String> *pas = new Array<String>(as); List<int> *pil = new List<int>(il);

print (*pas);

Программа не компилируется, поскольку объявления используемых классов заключены в пространство имен Exercise. Mодифицируйте код программ:, используя

(a) квалифицированные имена

(b) селективную директиву using

(c) механизм псевдонимов

(d) директиву using

2.8. Стандартный массив - это вектор

Хотя встроенный массив формально и обеспечивает механизм контейнера, он, как м1 видели выше, не поддерживает семантику абстракции контейнера. До принятия стандарта C++ для программирования на таком уровне мы должны были либо приобрести нужный класс, либо реализовать его самостоятельно. Теперь же класс массива является частью стандартной библиотеки C++. Только называется он не массив, а вектор.

Разумеется, вектор реализован в виде шаблона класса. Так, м1 можем написать

vector<int> ivec(10); vector<string> svec(10);

Есть два существенных отличия нашей реализации шаблона класса Array от реализации шаблона класса vector. Первое отличие состоит в том, что вектор поддерживает как присваивание значений существующим элементам, так и вставку дополнительных элементов, то есть динамически растет во время выполнения, если программист решил воспользоваться этой его возможностью. Второе отличие более радикально и отражает существенное изменение парадигмы проектирования. Вместо того чтобы поддержать большой набор операций-членов, применимых к вектору, таких, как sort() , min() , max() , find() и так далее, класс vector предоставляет минимальный набор: операции сравнения на равенство и на меньше, size() и empty(). Более общие операции, перечисленные выше, определены как независимые обобщенные алгоритмы.

Для использования класса vector мы должны включить соответствующий заголовочный файл.

#include <vector>



1 ... 19 20 21 [ 22 ] 23 24 25 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика