Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Стандартная библиотека

Шаблоны с параметрами-значениями

В шаблонах stack3 и stack4 для хранения элементов используется массив на 100 элементов. В некоторых случаях указанное значение избыточно, и память расходуется нерационально. В некоторых случаях этого количества недостаточно и тогда шаблоны stack3 и stack4 не подходят для решения задачи. Как же спроектировать шаблон так, чтобы при необходимости получить заданное количество элементов не нужно было писать новый шаблон? Это можно сделать (по крайней мере) двумя путями.

Первый (уже известный вам) – передавать количество необходимых элементов в конструктор и в конструкторе динамически выделять память (а в деструкторе освобождать). При этом затрачивается время на выделение/освобождение памяти.

Второй путь – определить шаблон с параметром-значением, указывающим количество элементов. Перепишем шаблон stack4 с учетом этого. При этом для исключения ненужных инстанцирований функций-членов используем технику наследования, приведенную выше:

 

class stack6_base

{

public:

stack6_base();

bool is_empty()const;

protected:

int top;

};

 

stack6_base::stack6_base()

:top(0)

{}

 

bool stack6_base::is_empty()const {return top==0;}

 

template <int N> class stack6_n:public stack6_base

{

public:

bool is_full()const;

};

 

template <int N> bool stack6_n<N>::is_full()const {return top==N;}

 

 

template <class T, int N> class stack6:public stack6_n<N>

{

public:

void push(T c);

T pop();

private:

T s[N];

};

 

template <class T, int N> void stack6<T,N>::push(T c){

assert(top<N);

s[top++]=c;

}

 

template <class T, int N> T stack6<T,N>::pop(){

assert(top>0);

return s[--top];

}

 

Инстанцирование шаблона выглядит следующим образом:

 

stack6<char,100> sc;//стек char на 100 элементов

stack6<int,10> si1, si2;//стек int на 10 элементов

stack6<char,5> sd;//стек char на 5 элементов

 

Следует заметить, что шаблон функции reverse_order, приведенный выше, будет работать также и с классами, сгенерированными по шаблону stack6:

 

reverse_order(sс);

 


 

Ни одна программа приличных размеров не пишется с использованием только «голых» конструкций языка. Обычно используются различные готовые библиотеки, в которых другие программисты уже написали код, облегчающий работу в данной предметной области. Существуют различные библиотеки для различных целей. Например, библиотека MFC используется для облегчения программирования для Win32 по сравнению с «чистым» программированием под Win32 API. Win32 API предполагает процедурный интерфейс к Windows, а MFC – объектно-ориентированный. Компания Borland предоставляет для тех же целей библиотеку OWL.

C Run-Time Library – предоставляет функции и макросы для многих аспектов программирования. Эта бибилиотека разрабатывалась достаточно давно, поэтому она ориентирована на использование в программах на языке C (как видно из ее названия). Так как C++ совместим с C, то C Run-Time Library можно использовать и в C++-программах. Функции этой бибилиотеки (в том виде, в котором она существует в Microsoft Visual С++) разбиты на 19 категорий, среди которых:

поддержка функций с переменной длиной списка аргументов;

выделение памяти (malloc, calloc и др.);

контроль жизненным циклом процесса (exec, exit);

операции с памятью (memcpy, …);

классификация символов (isalpha);

преобразование данных (atoi, _itoa, tolower);

отладка (_ASSERT, _CrtCheckMemory);

операции с каталогами (_chdir);

операции с файлами (_filelength);

математические функции и поддержка операций с плавающей точкой (sin, cos, abs, floor, ldexp(mant,exponent));

ввод-вывод

потоковый ввод-вывод (getc, fwrite)

низкоуровневый ввод-вывод (_open, _write)

ввод-вывод с/на консоль и из/в порт (_cprintf, _inp)

время и дата в стиле C (clock, difftime) <time.h>

алгоритмы поиска и сортировки (bsearch, qsort)

обработка ошибок в стиле С <errno.h>

функции над строками в стиле C (strcmp, strcpy) <string.h>, <stdlib.h>

Часть из этих функций стандартизирована ANSI и POSIX, часть – включена компанией Microsoft (все функции, начинающиеся с подчеркивания).

 

Существует также так называемая стандартная библиотека. Эта библиотека включена в стандарт C++.

Она предоставляет набор средств, которые можно классифицировать следующим образом:

1) Строки и потоки ввода-вывода;

2) Контейнеры (такие как vector, list и map) и алгоритмы, их использующие (сортировка, слияние, поиск и др.)

3) Поддержка численных расчетов (комплексные числа, вектора с арифметическими операциями и др.)

4) Стандартная библиотека C (поддержка операций с плавающей точкой, работа с C-строками и др.)

5) Поддержка средств языка времени выполнения (определение типа во время выполнения и др.)

 

Стандартная библиотека определена в пространстве имен std. Это сделано для того, чтобы избежать возможного конфликта между идентификаторами библиотеки и идентификаторами, определенными в программе. Поэтому нужно каждый идентификатор стандартной библиотеки предварять префиксом std::, либо перед их использованием написать using namespace std; (в последнем случае теряется преимущество от определения библиотеки в отдельном пространстве имен).

Каждое средство стандартной библиотеки становится доступным через какой-либо стандартный заголовочный файл наподобие <iostream>. Например, чтобы использовать строки, нужно подключить <string>, а для использования списков – <list>. Полный список заголовочных файлов дан в [Страуструп].

 

Ввод-вывод

Требуемый заголовочный файл – <iostream>.

Стандартный поток вывода – cin, ввода – cout. Ввод-вывод определен для всех встроенных типов. При выводе в поток с помощью операторов << и >> осуществляется два действия: преобразование значений в последовательность символов, и вывод этой последовательности символов с помощью низкоуровневых операций вывода.

void f(){

cout<<10<<13.7<<”abcd”;

double d; int i;

cin>>d>>i;

}

Здесь последовательность символов: 1,0,1,3,.,7,a,b,c,d.

Операторы << можно ставить в цепочки благодаря тому, что результат каждой операции является потоком.

Ввод осуществляется оператором >>. Тип операнда в его правой части определяет способ интерпретации символов и то, куда будут записываться полученные значения. Стандартный поток ввода – cin.

Когда преобразование не желательно и мы хотим напрямую работать с последовательностями символов, мы используем функции неформатного ввода-вывода put и get.

cout.put('s');

char ch;

cin.get(ch);

 

Форматирование.

Часто необходимо управлять форматом вывода чисел (система счисления, точность чисел с плавающей точкой и др.)

cout<<123.4567;

cout.setf(ios_base::showpos);

cout<<123.4567<<setprecision(8)<<123.4567;

 

Строки

В ст. библ. имеется тип string, который дополняет строковые литералы, использовавшиеся ранее. Тип string обеспечивает множество полезных операций над строками, например, конкатенацию.

string s1="Hello",s2="world";

string s3=s1+", "+s2+’!’;

cout<<s3;

Сложение (+) строк означает конкатенацию. Можно складывать строку со строкой, строковым литералом и символом. Оператор += добавляет что-либо в конец строки:

s3+='\n';

Строки могут сравниваться друг с другом и со строковыми литералами:

if(s1==s2){ }

if(s3=="Привет, мир!"){ }

Другие операции:

string s4=s3.substr(0,4);//взятие подстроки

s4.insert(0,"Road to ");//вставка

s4.replace(s4.find("Hell"),4,"Heaven");//поиск и замена

TextOut(hdc,1,1,s4.c_str(),s4.size());//преобразование в C-строку и число символов строки

 

Того же эффекта можно добиться, используя C-строки, но это будет более громоздко. Кроме того строки string можно передавать в функции как аргументы по значению и возвращать из функции по значению, предоставив системе заботиться о распределении памяти.

 

 

Контейнеры

Класс, главной целью которого является хранение объектов, называется контейнером. Реализация контейнеров, подходящих для данной задачи, и поддержка их нужными операциями – важнейшие шаги при написании любой программы.

 

Вектор

 

 

Существуют

string

vector

list

ostream, istream, ofstream, ifstream, ostringstream.

 

Проектирование программ

 

Понятия – объекты – сообщения – атрибуты – классы – методы – общность (наследование).

Литература: [1]

 

Правила и рекомендации по написанию хороших программ применительно к конкретному языку.

Пример. Несколько рекомендаций для C++ из [5]:

· Везде, где только можно, используйте const.

· Для классов с динамическим выделением памяти объявляйте копирующий конструктор и оператор присваивания.

· Откладывайте определение переменных до последнего момента.

· Тщательно обдумывайте использование встраиваемых функций.

· Уменьшайте зависимости файлов при компиляции.

· Предпочитайте ошибки во время компиляции ошибкам во время выполнения.

В [5]приводятся обоснования, примеры использования и выгоды от пименения этих правил.

 

Паттерны проектирования. (Design Patterns) Литература: [6]

Другой перевод – шаблоны проектирования (не путать с template).

 

Под паттернами проектирования понимается описание взаимодействия объектов и классов, адаптированных для решения общей задачи в конкретном контексте.

Пример. Концепция Document-View в MFC.

Document хранит представление, а View (Вид) определяет отображение документа на экране. Между документом и его видом в MFC установлен протокол взаимодействия «подписка/оповещение». Вид должен гарантировать, что внешнее представление отражает состояние документа. При каждом изменении внутренних данных документ оповещает все зависящие от него виды, в результате чего вид обновляет себя. Такой подход позволяет присоединить к одному документу несколько видов, обеспечив тем самым различные представления. Можно создать новый вид, не переписывая документ.

<Рисунок с док. и 3 видами: табл, гистограмма, круговая диаграмма >

 

Несколько паттернов из [6].

· Façade (Фасад) Предоставление единого интерфейса для набора различных интерфейсов в системе.

· Adapter (Адаптер) Преобразование стандартного интерфейса класса в интерфейс, более подходящий для нужд клиента

· Итератор

<== предыдущая лекция | следующая лекция ==>
Исключение ненужных инстанцирований функций-членов | Тема 1. Социальная работа как область общественной практики
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 374; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.034 сек.