Разделы презентаций


Обобщенное программироание Шаблоны

Содержание

Понятие обобщенного программированияОбобщенным программированием называется создание универсального программного кода, инвариантного к типу обрабатываемых данных. Например: функция выбора максимального или минимального из двух значений одинаково реализуются для разных числовых типов данных (int, float,

Слайды и текст этой презентации

Слайд 1Тема: Обобщенное программирование. Шаблоны
Понятие обобщенного программирования
Шаблоны функций
Контейнерные классы. Класс «стек»,

как пример контейнерного класса
Шаблоны описания класса и шаблоны методов
Параметры шаблонов

Тема: Обобщенное программирование. ШаблоныПонятие обобщенного программированияШаблоны функцийКонтейнерные классы. Класс «стек», как пример контейнерного классаШаблоны описания класса и

Слайд 2Понятие обобщенного программирования
Обобщенным программированием называется создание универсального программного кода, инвариантного

к типу обрабатываемых данных.
Например:
функция выбора максимального или минимального из

двух значений одинаково реализуются для разных числовых типов данных (int, float, double)
организация данных в виде стека или множества одинакова для элементов разных типов и т.д.
Английское название generic programming - “родовое программирование”
Непосредственно не связано с ООП, но замечательным образом сочетается
Языковые средства обобщенного программирования еще не «устоялись»
Понятие обобщенного программированияОбобщенным программированием называется создание универсального программного кода, инвариантного к типу обрабатываемых данных.	Например: функция выбора максимального

Слайд 3Обобщенное программирование в С
Макросы с параметрами - возможность простейшего обобщенного

программирования функций
Пример: функция выбора максимального из двух значений #define max(x,y)

((x)>(y) ? (x) : (y))
Данный макрос пригоден для аргументов всех числовых типов (int, float, double)
Обобщенное программирование в СМакросы с параметрами - возможность простейшего обобщенного программирования функций 	Пример: функция выбора максимального из

Слайд 4Функция сортировки массива qsort()
Выполняет сортировку массива данных любого типа
base -

указатель на сортируемый массив (или подмассив)
nelem - количество элементов, подлежащих

сортировке (например, весь массив)
width - длина данных для элемента массива в байтах
fcmp - указатель на функцию сравнения элементов

void qsort(void* base, size_t nelem, size_t width, int(*fcmp)(const void*, const void*));

Функция сортировки массива qsort()Выполняет сортировку массива данных любого типаbase - указатель на сортируемый массив (или подмассив)nelem -

Слайд 5Шаблоны классов. Параметризованные классы
Контейнерные классы — классы, объединяющие атомарные объекты

- элементы некоторого заданного типа. Примеры:
Список
Стек
Множество
и т.п

Шаблоны классов. Параметризованные классыКонтейнерные классы — классы, объединяющие атомарные объекты - элементы некоторого заданного типа. Примеры: СписокСтекМножествои

Слайд 6Стек – описание класса
class stack_char {
public:

stack_char(unsigned);
~stack_char();
void push(char);

char pop();
unsiged size() const;
private:
char* base;
char* top;
unsigned max_size;
};

class stack_int {
public:
stack_int(unsiged);
~stack_int();
void push(int);
int pop();
unsigned size() const;
private:
int* base;
int* top;
unsigned max_size;
};

файл stack.h

Стек – описание классаclass stack_char {  public:   stack_char(unsigned);  ~stack_char();    void

Слайд 7Стек – реализация методов
#include “stack.h”
#include
#include
stack_char::stack_char(unsigned sz) {

if ((top=base=new char[max_size=sz])==NULL) {
cerr

для стека.\n”;
exit(1);
}
}

stack_char::~stack_char() {
delete [ ]base;
}

файл stack.cpp

Стек – реализация методов#include “stack.h”#include #include stack_char::stack_char(unsigned sz) {   if ((top=base=new char[max_size=sz])==NULL) {	 cerr

Слайд 8Стек – реализация методов (продолжение)

void stack_char::push(char a) {

if (size() == max_size) cerr

*top++ = a;
}
char stack_char::pop(void) {
if (size() == 0) cerr << “Исчерпание стека.\n”;
return *--top;
}
unsigned stack_char::size(void) const {
return top-base;
}

файл stack.cpp

Стек – реализация методов (продолжение)void stack_char::push(char a) {     if (size() == max_size) cerr

Слайд 9Шаблон класса stack
#ifndef __STACK_H
#define __STACK_H
template class stack {
public:
stack(unsigned);
~stack();
void

push(const T&);
T pop(void);
unsigned size(void) const;
private:
T* base;
T* top;
unsigned max_size;
};
#endif
файл stack.h

Шаблон класса stack#ifndef __STACK_H #define __STACK_Htemplate class stack {	public:		stack(unsigned);		~stack();		void push(const T&);		T pop(void);		unsigned size(void) const;	private: 		T* base;		T* top;		unsigned

Слайд 10Шаблоны методов класса stack
#ifndef __STACK_HPP
#define __STACK_HPP
#include “stack.h”
#include
#include
template

T> stack::stack(unsigned sz) {
if ((top=base=new T[max_size=sz])==NULL) {
cerr

памяти для стека.\n”;
exit(1);
}
}
template stack::~stack() {
delete [ ]base;
}

файл stack.hpp

Шаблоны методов класса stack#ifndef __STACK_HPP #define __STACK_HPP#include “stack.h”#include #include template stack::stack(unsigned sz) {	if ((top=base=new T[max_size=sz])==NULL) {		cerr

Слайд 11Шаблоны методов класса stack (продолжение)

template void stack::push(const T& a) {
if

(size() == max_size) cerr

T stack::pop(void) {
if (size() == 0) cerr << “Исчерпание стека.\n”;
return *--top;
}
template unsigned stack::size(void) const {
return top-base;
}
#endif

файл stack.hpp

Шаблоны методов класса stack (продолжение)template void stack::push(const T& a) {	if (size() == max_size) cerr

Слайд 12Использование шаблона класса stack
#include “point.h”
#include “stack.h”
#include “stack.hpp”
void main(void)
{
stack sch(100);
stack sint(50);
stack

sp(400);
sch.push(‘A’);
sint.push(111);
sp.push(Point(1,1));
........................
}

Использование шаблона класса stack#include “point.h”#include “stack.h”#include “stack.hpp”void main(void){	stack sch(100);	stack sint(50);	stack sp(400);	sch.push(‘A’);	sint.push(111);	sp.push(Point(1,1));	........................}

Слайд 13Параметры шаблонов
Шаблон может иметь несколько параметров
Параметры шаблона не обязательно являются

именами типов
Кроме имен типов можно использовать константные выражения

Параметры шаблоновШаблон может иметь несколько параметровПараметры шаблона не обязательно являются именами типовКроме имен типов можно использовать константные

Слайд 14Параметры шаблонов

template class stack {
public:
stack();
void push(const T&);
T

pop(void);
unsigned size(void) const;
private:
T base[max_size];
T* top;
};
файл stack.cpp

Параметры шаблоновtemplate class stack {	public:		stack();		void push(const T&);		T pop(void);		unsigned size(void) const;	private: 		T base[max_size];		T* top;};файл stack.cpp

Слайд 15Параметры шаблонов
#include
template
class stack::stack() { top=base;

}
template
void stack::push(const T& a) {
if (size()

== max_size) cerr << "Переполнение стека.\n";
*top++ = a;
}
template
T stack::pop(void) {
if (size() == 0) cerr << "Исчерпание стека.\n";
return *--top;
}
template
unsigned stack::size(void) const {
return top-base;
}
Параметры шаблонов#include template	class stack::stack() { top=base; }template	void stack::push(const T& a) {		if (size() == max_size) cerr

Слайд 16Использование
#include “point.h”
void main(void) {
stack sch;
stack sint1;
stack sint2;
stack

sp;

sch.push('A');
sint1.push(111);
sint2.push(111);
// sint1 = sint2; - ошибка, т.к. переменные различных типов!
sp.push(Point(1,1));
}

Использование#include “point.h”void main(void) {	stack sch;	stack sint1;	stack sint2;	stack sp;		sch.push('A');	sint1.push(111);	sint2.push(111);	// sint1 = sint2; - ошибка, т.к. переменные различных типов!	sp.push(Point(1,1));}

Слайд 17РЕЗЮМЕ
Шаблон есть средство обобщенного описания класса, а не определение класса.

(Компиляция файлов stack.h и stack.hpp не влечет распределения памяти. Реальное

распределение памяти происходит при генерации параметризованных классов stack, stack и т.д. в тот момент, когда компилятор встречает определение переменной соответствующего типа.)
Шаблон класса должен быть видим компилятору в момент использования. (Содержимое как файла stack.h, так и файла stack.hpp д.б. видимо внутри файла main.cpp. Поэтому, либо надо включать файлы, содержащие шаблоны классов директивой #include, либо задавать при компиляции глобальную область видимости шаблонов.)
В первом примере размер стека являлся атрибутом переменных-экземпляров одного и того же класса. (Распределение памяти происходит на этапе выполнения. Присваивание переменных-стеков разного размера определено по умолчанию).
Во втором примере размер стека является атрибутом, определяющим класс. (Он известен во время компиляции программы и распределение памяти происходит на этапе компиляции. Параметризованные классы с различными значениями параметра max_size задают различные типы.)
РЕЗЮМЕШаблон есть средство обобщенного описания класса, а не определение класса. (Компиляция файлов stack.h и stack.hpp не влечет

Обратная связь

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

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика