|
Программирование >> Инициализация объектов класса, структура
Пространство имен 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>
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |