cpp-oop (823968), страница 18
Текст из файла (страница 18)
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»135void Add(type m);// добавление элемента к множествуvoid Del(type m);// удаление элемента из множества// проверка вхождения элемента во множествоintIn(type m);intInSet(int Nn);voidOutSet();// заполнение множества// вывод элементов множества// пересечение множествTset& CrossSet(Tset &B);Tset &operator +(Tset &B); // объединение множествTset &operator =(Tset &B); // присваивание множеств};template <class type> Tset<type>::Tset(Tset<type>&A){contents = new type [size=A.Getsize()];sizetek=A.sizetek;for(int i=0;i<sizetek;i++)contents[i]=A.contents[i];}template <class type> int Tset<type>::InSet(int Nn){type c; int k=0;if (Nn>Getsize()) Nn=Getsize();cout<<"Введите "<<Nn<<" элементов множества: "<<endl;for (int i=0;i<Nn;i++){cin>>c;if (!In(c)){if(!SetEl(k,c)) return 0;k+=1;}}return 1;}template <class type> void Tset<type>::OutSet(){if (sizetek!=0){for(int i=0;i<sizetek;i++)ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»136cout<<" "<<GetEl(i);}else cout<<" Пустое множество";cout<<endl;}template <class type> int Tset<type>::In(type m){for (int i=0;i<sizetek;i++)if (m==GetEl(i)) return 1;return 0;}template <class type> void Tset<type>::Add(type m){if (!In(m))if (sizetek<size) SetEl(sizetek,m);}template <class type> void Tset<type>::Del(type m){int h;if (In(m)){h=0;for(int i=0;i<sizetek;i++)if(h) contents[i-1]=contents[i];else if (m==GetEl(i)) h=1;sizetek-=1;}}template <class type>Tset<type>& Tset<type>::operator =(Tset<type> &B){if (this==&B) return *this;if (contents!=NULL) delete [] contents;contents = new type [size=B.Getsize()];ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»137sizetek=B.sizetek;for(int i=0;i<sizetek;i++){contents[i]=B.contents[i];}return *this; }template <class type>Tset<type> & Tset<type>::operator +(Tset<type> &B){for(int i=0;i<B.sizetek;i++)Add(B.GetEl(i));return *this;}template <class type>Tset<type> &Tset<type>::CrossSet(Tset<type> &B){int i=0;do{if( !B.In(GetEl(i)))Del(GetEl(i));else i++;}while (i<sizetek);return *this;}template <class type>Tset<type>& operator -(Tset<type> &A,Tset<type> &B){Tset<char> *C=new Tset<char>(A.Getsize());for(int i=0;i<A.sizetek;i++)if(!B.In(A.GetEl(i)))C->Add(A.GetEl(i));return *C;}template <class type>Tset<type>& operator*(Tset<type>&A,Tset<type> &B){int l;ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»138if(A.Getsize() > B.Getsize()) l=A.Getsize();else l=B.Getsize();Tset<char> *C=new Tset<char>(l);for(int i=0;i<A.sizetek;i++){if( B.In(A.GetEl(i))) C->Add(A.GetEl(i));}return *C;}void main(){setlocale(0,"russian");int n;Tset<char> aa(15),bb(10),dd(10),cc;cout<<"Введите мощность множества n<= ";cout<<aa.Getsize()<<endl;cin>>n;aa.InSet(n);cout<<"Введите мощность множества n<= ";cout<<bb.Getsize()<<endl;cin>>n;bb.InSet(n);cout<<"Введите множества множества n<= ";cout<<dd.Getsize()<<endl;cin>>n;dd.InSet(n);cout<<" Множество aa: ";aa.OutSet();cout<<" Множество bb: ";bb.OutSet();cout<<" Множество dd: ";dd.OutSet();Tset<char> ee,pp=aa; // использование копирующего конструктораcout<<" Множество pp=aa: ";pp.OutSet();ee=aa*bb;cout<<"ee=aa*bb="; ee.OutSet();aa.CrossSet(bb);cout<<"aa.CrossSet(bb)=";aa.OutSet();aa=aa+dd;cout<<"aa=aa+dd=";aa.OutSet();ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»139cc=dd-bb;cout<<"cc=dd-bb";cc.OutSet();system("pause");}Тестирующая программа осуществляет формирование трех множеств букв иоперации над ними, а также фиксирует последовательность и место вызова конструкторовразличного назначения и деструкторов.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»1406.3Контейнеры на основе шаблоновПостроение контейнеров на основе шаблонов – интересная задача.
Такой контейнерпозволяет организовать хранение элементов самых разных типов данных.Пример 6.4. Контейнер на основе шаблона. Реализуем программу, использующуюшаблон Динамический массив для организации динамического массива, хранящегообъекты классов Число и Строка (рис. 6.
3).typeTNumarrayob<TNum>int numPrint()arrayobtype **contentsint sizeint narrayob()~ arrayob()operator[]()add()sizeofmas()TStrchar st[40]Print()Рис. 6.3. Иерархия классов для примера 6.4#include <locale.h>#include <string.h>#include <iostream>#include <stdlib.h>using namespace std;template <class type> // объявление шаблона класса// класс Динамический массивclass arrayob{type **contents;// массив указателей на объекты типа typeint size;// максимальное количество объектов в массивеint n;// реальное количество объектов в массивеpublic:arrayob(int number){ contents=new type * [size=number];}~arrayob ();void add(type *p){ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»141if(n==size)cerr<<"Выход за пределы";else {contents[n]=p; n++;}}type & operator [] (int x)// итератор массива объектов{if ((x<0)||(x>=size)){ cerr <<"Ошибочный индекс "<<x<<endl;x=0;}return *contents[x];}int sizeofmas(){return n;}// реальный размер массива};template <class type> arrayob<type>::~arrayob (){for(int i=0;i<size;i++) delete contents[i];delete []contents;}// класс Числоclass TNum{public:int num;virtual void Print(void) { cout<<num<<" "; }TNum(){cout<<"Введите число"<<endl; cin>>num;}TNum(int n):num(n) {}virtual ~TNum(void){}};class TStr:public TNum// класс Строка{public:char *st;virtual void Print(void) { TNum::Print(); cout<<st<<" ";}TStr();// конструктор по умолчаниюTStr(char *s):TNum(strlen(s))// конструктор с параметрами{st=new char[num+1];strcpy(st,s);st[num]='\0';}ОглавлениеИванова Г.С., Ничушкина Т.Н.
«Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»142virtual ~TStr(void){ delete [] st;}};TStr::TStr():TNum(40){cout<<"введите строку "<<endl;st=new char[num+1];num=strlen(st);cin>>st;st[num+1]='\0';}arrayob<TNum>ob_a(5); //массив из 5 указателей на объектыvoid main(){setlocale(0,"russian");int i;for(i=0;i<5;i++)if (i/2*2==i)ob_a.add(new TNum);else ob_a.add(new TStr);// добавить Число// добавить Строкуcout<<"Содержимое контейнера "<<"\n";for (i=0;i<ob_a.sizeofmas();i++)ob_a[i].Print();system("pause");}Шаблон оперирует указателями на объекты иерархии.
Для вызова метода Print()и деструкторов классов используется механизм сложного полиморфизма.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»143Вопросы для самоконтроля1. Что такое шаблон? Определите понятие шаблона функции и шаблона класса.Приведите примеры применения шаблонов классов.Ответ.2. Сопоставьте понятия «параметризованные» и «контейнерные» классы. Чемопределяется выбор того или иного типа классов в конкретном случае?Ответ.3. Определите, чем контейнеры, основанные на иерархии классов, отличаются отшаблонов, базирующихся на шаблонах.Ответ.ОглавлениеИванова Г.С., Ничушкина Т.Н. «Объектно-ориентированное программирование на языке C++ в среде Microsoft Visual Studio 2008»1447ИсключенияПрактика разработки сложных программных систем позволяет сделать вывод, чтодостаточно большая часть любой программы приходится на перехват и обработкуситуаций, при возникновении которых по каким-либо причинам нормальный процессобработкинарушается(вводнекорректнойинформации,попыткачитатьизнесуществующего файла, обнаружение ситуации «деление на нуль» и т.
п.).Использование для проектирования программы технологии ООП приводит к тому,что обычно возникновение некорректной ситуации фиксируется в одном месте (объекте)программы, а ее исправление необходимо осуществлять в другом. Для обработки такихситуаций применяют механизм исключений.Традиционно в языках С и С++ используются разные стандарты обработкиисключений.7.1Механизм исключений С++В языке С++ для работы с исключениями существуют специальные операторыthrow, try и catch.