Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
УМКД_ОБП_Урдабаева.doc
Скачиваний:
113
Добавлен:
01.03.2016
Размер:
1.29 Mб
Скачать

Иерархия схемасы

streambuf

(iostream.h)

filebuf

(fstream.h)

conbuf

(constream.h)

strstreambuf

(strstream.h)

Ios класы форматталған енгізуді - шығаруға арналған құралдар және қателердің тексерулері асырайды .

Иерархия схемасы

ios

ifstream

fstream

strstream

iostream

istrstream

istream

ostream

strstreambase

fstreambase

ostrstream

ofstream

ios — ағындардың базалық класы;

istream — ағындардың енгізу класы;

ostream — ағындардың шығару класы;

iostream — екі бағыт беру ағындардың класы;

istringstream — жолдық ағындардың енгізу класы;

ostringrstream — жолдық ағындардың шығару класы;

stringstream — екі бағыт беру жолдық ағындардың класы;

ifstream — файлдық ағындардың енгізу класы;

ofstream — файлдық ағындардың шығару класы;

fstream — екі бағыт беру файлдық ағындардың класы.

Тақырыптықтарды файлдарда кластардың мынадай сипаттаулары болады:

< ios > — ағындардың енгізу / шығару базалық класы;

< iosfwd > — алдын - ала жариялаудың енгізу / шығару құралы;

< istream > — енгізу ағынының шаблоны;

< ostream > — шығару ағынының шаблоны;

< iostream > — ағындармен енгізу / шығару стандартты объектілері және

операциялары;

< fstream > — файлдарға енгізу / шығару ағындары;

< sstream > — жолдарға енгізу / шығару ағындары;

< streambuf > — буферлеу енгізу / шығару ағындары;

< iomanip > — манипуляторлар

    1. Енгізу – шығару ағыны

Программалау тілдері үшін енгізу - шығару стандартты құрылғыларын проекциялау және реализациялау мақсатындағы кең таралған қиындық. Дәстүрлі енгізуді - шығару құрылғылары тек аз ғана қоса салынған типтердің саны. Бірақ, қарапайым емес С++ бағдарламаларда көптеген пайдаланушылық мәліметтер типтері бар. Сондықтан,осындай мағыналы типті енгізу - шығару мүмкіндіктерін пайдалануға мүмкіндік беру қажет. Енгізу - шығару құрылғылары жай ғана қарапайым, ыңғайлы, қолданыста сенімді және де ең қажеттісі бірдей болу керек екені айқын. Әзірге бәрінің көңілінен шығатын нәтижені ешкім таба қойған жоқ, сол себепті қолданушыға басқа енгізу - шығару құрылғыларын құруға мүмкіндік беру керек, және де қолданысына қарай стандартты енгізу - шығару құрылғыларын кеңейту.

С++-ті жасау мақсаты: қолданушы мәліметтердің жаңа типтерін сипаттай алуы, ыңғайлы және нәтижелі жұмыс істей алуы қоса салынған типтері секілді. Сөйтіп, С++ программалау және қолдану үшін енгізу - шығару құрылғылары бәріне ортақ болғанын талап еткен дұрыс сияқты. Осы талаптарды қанағаттандыру нәтижесінде енгізу - шығару ағындық құрылғылары алынды. Енгізу - шығару ағындық құрылғыларының негізгі мақсаты – бұл белгілі бір типтің объектілерін символдар жүйесіне және керісінше айналдыру процесі. Енгізу - шығарудың басқа схемалары бар, бірақ көрсетілгені негізгі болып табылады, және де символды тек жай ғана биттер жиыны деп санасақ, оның табиғи алфавиттік байланысын ескермей, онда көптеген екілік енгізу - шығару схемасын оған келтіруге болады. Сол себепті бағдарламашылық мән мақсаты анықталған типтің объектісі мен типсіз ( яки маңызды ) жол арасындағы байланысын сипаттау болып табылады.

    1. Жолдық ағындар

Жол ағыны жұмысын istringstream, ostringstream stringstream кластары қамтамасыз етеді, istream, ostream және iostream өндірістік класстар болып табылады. Жол ағымын қолдану үшін бағдарламаға ostream бастапқы файлын қосу қажет.

Жол ағынын қолдану, файл ағынын қолдану аналогты айырмашылығы физикалық мәлімет дискідегі файлда емес, оперативтің есінде сақталады. Одан басқа, жол ағыны класы str ( ) әдісінен құралады, string жол көшірмесін қайтаратын немесе сондай жол ағынының мағынасын иемденетіндер:

string str ( )

void str ( const string & s );

Жол ағынында кейбір C кітапханасында sscanf ( ) және sprintf ( ) аналогты функция болып табылады, сонымен қатар естегі жолдармен жұмыс жасайды, енгізу және шығару консолі сипатталған. Мысалы: sprintf ( ) көмегімен естегі кейбір символдық жолдарды қалыпқа келтіруге болады, сосын ол экранға шығады. Бұл қиындықтарды ostringstream объектісімен оңай шешуге болады.

Мысал ретінде алдық бағдарламаның модифицирленген нұсқасын келтірейін, мәтін файлын экранға шығаратын, мәтіндегі әр жолды тексеретін “Line N: ”, мұндағы N—жол нөмірі:

// MyCopy.ccp файлынан — error ( ) функциясын анықтау

// . . .

int main ( int argc. char* argv [ ] ) {

i f (argc != 2) error ( " Қате аргумент саны. " ) ;

ifstream tfile ( argv [ 1 ] ) ;

if ( ! tfile ) error ( “ Қате енгізу файлы : ” . argv [ 1 ] ) ;

int n = 0

char buf [ 1024 ] ;

while ( ! tfile. eof ( ) ) {

n++;

tfile. getline ( buf. sizeof ( buf ) ) ;

line << “ Line ” << setw ( 3 ) << n << “ : “ << buf << endl ;

}

return 0 ;

}

Көрсетілген бойынша, ағындар файлға байланысты болу мүмкін, негізгі жадта сақталған символдарға емес, диск арқылы. Негізгі жадқа да символдарды қосуға болады. Мысалы: тез баспаға жатпайтын хабарламаны форматтау үшін шығулы жолдық ағындармен қолдануға болады. 

char* p = new char[message_size];

   ostrstream ost(p,message_size);

   do_something(arguments,ost);

   display(p);

Функция do_something стандарттық шығару операция бойынша ost деген функцияны ағынға жазуға болады, ost функциясын бағынушы функцияларға тапсыруға да болады. Әлде толықтыру бақылауы қажет емес, яғни ost өзінің өлшемін біледі, және толықтырған кезде fail ( ) деген жағдайға ауысады. Содан соң функция display « шын » шығулы ағынға хабарлама жіберу мүмкін. Ондай әдіс көбінесе күрделі құрылғыларға соңғы операцияларды жазғанда үйлеседі, яғни шығулы құрылғылар әдеттегі жол жүйелілікке апарады. Мысалы, ost функциясы экрандағы бекітілген облысқа сәйкес болу мүмкін.   Тап солай , istrstream шығулы жолдық ағын болады, ол нөлмен аяқталатын символдардан окылады :

   void word_per_line ( char v [ ], int sz )

   /*

"v" өлшеммен"sz" бірден жолға жазу

   */

   {

   istrstream ist ( v, sz );

   char b2 [ MAX ];

   while ( ist >> b2 ) cout << b2 << " \n ";

   }

Аяқтайтын нөл файлдың соңы болып саналады.

Жолды ағындар < strstream.h > файлында көрсетіледі.

Бақылау сұрақтары:

  1. Ағын дегеніміз не?

  2. Ағынның түрлері қандай?

  3. Ағын түрлерінің бір-бірінен ерекшелігі неде?

  4. Ағындық кластар дегеніміз не?

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.

  2. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004

  3. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учебное пособие. – М.: Финансы и статистика, 2004

  4. Гради Буч. Объектно - ориентированный анализ и проектирование с примерами приложений на С++. - М.: Изд. Бином, Невский Диалект, 1998.

  5. А.В. Замулин. Курс лекций: ООП (С++, Ява, C#)

14 дәріс.

Тақырыбы: Стандартты контейнерлі кластар

Дәріс мақсаты: контейнер түсінігімен танысу және контейнерлік кластарды қолдануға үйрену.

Кілттік сөздер: контейнер; контейнерлік класс; тізім; стек; кезек; дек.

Жоспар:

  1. Контейнерлік кластар

  1. Контейнерлік кластар.

Көптеген есептердің шешімі әр түрлі формадағы объектілердің жиынтығынан және өңдеулерінен тұрады.

Басқа типті объектілерді сақтауға және олармен жұмыс жасайтын объектті контейнер деп атайды. Контейнердің классикалық мысалдарына тізім, вектор, ассоциативті массивтер жатады. Кей кезде контейнер мазмұнын тізбектелген деп атайды.

С++ тілінде контейнерлерді контейнерлік және параметрлік кластарды қолдану арқылы жүзеге асырады.

Контейнерлік класс – кейбір объектілерді басқарушы объектіге,яғни контейнерге қосу үшін композиция немесе толтыру механизімін қолданатын өңдеуді қабылдау класы. Контейнерлік кластар бірнеше объектілік өрістерден немесе объектіге көрсететін өрістерден тұрады. Егер контейнерлік класс композиция механизімін қолданса, онда басқарушы объектілердің типі мен саны объектілік өрістердің типі және санымен анықталған. Егер толтыру механизімін қолданса, контейнер кейбір базалардың объектілерін және осы кластағы барлық объектілерін басқара алады.

Кез келген контейнерлік кластың негізгі мақсаты объектілерді тізбектеп өңдеу. Бұл өңдеу екі әдіспен жүзеге асырылады:

  1. Контейнердің барлық элементтерін қарау үшін құрылған арнайы процедураға негізделеді. Бұл процедураға параметр ретінде контейнер элементтерін өңдеу алгоритмін жүзеге асыратын функция немесе процедура аты беріледі.

  2. Берілген контейнердің түріне сәйкес келетін анықталған итератор немесе класс итераторы арқылы жүзеге асырылады. Итераторлардың көмегімен программист контейнерлермен жұмыс жасай алады. Бірнеше кілттік компонеттік функциялар программистке тізбектелген элементтердің соңын табуға мүмкіндік береді.

Әдетте контейнерлік кластар вектор(vector), тізім(enumeration), динамикалық вектор(dynamic vector), стек(stack), очередь(queue), дек(deq), жиын(set), бір және бірнеше байланыс тізімдер(lists) типтік структураларды жүзеге асырады.

Осы келтірілген тізімнен вектор мен тізім динамикалық емес структурулар.

Стек – элементтерді қосуға және алуға болатын бір жақ шеті дәнекерленген труба ретінде елестетуге болатын контейнер. Стек LIFO қызметін жүзеге асырады (Last in – first out, соңғы келген – бірінші кетеді.)

Сурет 1:Стек

Мысал:

interface Stack {

boolean empty(); //Стек бос па?

void clear(); // Стекті босату.

void push(int val); // Стекке сан қосу (басына).

int pop() throws Exception; // Стектің басындағы санды өшіру.

int top() throws Exception; // Стектің басын алу (өшірмей).

}

Бос стектен элемент алуға болмайды.

Кезек – соңынан басына қарай өтетін тек бір бағытта бағытталған екі шеті бар труба ретінде қарастыруға болады. Кезек FIFO қызметін жүзеге асырады (First in – first out, бірінші келген – бірінші кетеді.)

Сурет 2:Кезек

Мысал:

interface Queue {

boolean empty(); // Кезек бос па?

void clear(); // Кезекті босату.

void push(int val); // Кезекке сан қосу (соңына).

int pop() throws Exception; // Кезектің басынан санды өшіру

int front() throws Exception; // Кезектің басын алу(өшірмей).

}

Бос кезектен стектен сияқты элемент алуға болмайды.

Дек – (double ended queue, екі жақты кезек) –стек пен кезектің симбиозы. Бір бірінен тәуелсіз жұмыс жасауға болатын екі шеті ашық труба ретінде елестетуге болады.

Сурет 3:Дек

Мысал:

interface Deq {

boolean empty(); // Дек бос па?

void clear(); // Декті босату.

void pushFront(int val); // Дектің басына сан қосу.

void pushBack(int val); // Дектің соңына сан қосу.

int popFront() throws Exception; // Дектің бірінші элементін өшіру.

int popBack() throws Exception; // Дектің соңғы элементін өшіру.

int front() throws Exception; // Дектің бірінші элементін алу (өшірмей).

int back() throws Exception; // Дектің соңғы элементін алу (өшірмей).

}

L2-тізім сызықты екі байланысты тізім – жіпке өткізілген моншақ ретінде елестетуге болады. Тізім үшін оның басы және соңы, сондай-ақ көрсеткіш анықталған. Көрсеткіш әр уақытта тізім элементтерінің арасында болады. Төмендегі мысалды көрсетілгендей тізімге элементті қосу немесе жою тек көрсеткіштің қасында ғана орындалады.

Сурет 4:L2-список

Мысал:

interface L2List {

boolean empty(); // Тізім бос па?

void clear(); // Тізімді босату.

void toFront(); // Көрсеткішті тізімнің басына жылжыту.

void toBack(); // Көрсеткішті тізімнің соңына жылжыту.

boolean begin(); // Көрсеткіш тізімнің басында ма?

boolean end(); // Көрсеткіш тізімнің соңында ма?

void forward() throws Exception; // Көрсеткішті алдыға жылжыту.

void backward() throws Exception; // Көрсеткішті артқа жылжыту.

int after() throws Exception; // Көрсеткіштен кейін сан алу;

int before() throws Exception; // Көрсеткіштің алдында сан алу;

void insertBack(int val); // Көрсеткіштен кейін сан қосу;

void insertFront(int val); // Көрсеткіштің алдында сан қосу;

int eraseBack() throws Exception; // Көрсеткіштен кейінгі санды өшіру .

int eraseFront() throws Exception; // Көрсеткіштің алдындағі санды өшіру.

}

Мысал: Элемент бойынша өңдеу процедурасымен контейнерлік класс.

Сан – Жол – Таблица иерархия кластарына жататын сұрыпталған элементтер тізімі базасында контейнер жасау керек болсын. Кластар структурасын кезең бойынша құрамыз. Иерархия кластарының негізіне Тізім – Элемент кластарын саламыз.

Бұл екі класс басқарылатын объектілері Элемент класынан алынған контейнерлік класттарды құрады. Тізім класы Элемент класының элемент-объектілер көрсеткіші: бірінші элементке көрсеткіш, соңғы элементке көрсеткіш және ағымдағы элементке көрсететін үш өрістерден тұрады. Элемент класы келесі және алдыңғы тізім элементтерінің адресін сақтайтын, сол кластағы элемент көрсеткіштерінен тұратын екі өрістен тұрады.

Содан соң осы класттардың базасында Сұрыпталған тізім абстрактілі контейнерлік класын құрамыз. Онда элементтерді салыстыратын ішкі шақырылатын әдіс Compare-мен Sort сұрыптау әдісі қарастырылған. Бұл ішкі салыстыру әдісі осы кластың базасында әр түрлі сұрыптауларды қолдануға болатын басқа класттарды құруға мүмкіндік береді.

Бақылау сұрақтары:

  1. Контейнер дегеніміз не?

  2. Контейнерлік класс ұғымын қалай түсінесіз?

  3. Контейнерлік класс түрлері қандай?

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.

  2. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004

  3. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учебное пособие. – М.: Финансы и статистика, 2004

  4. Гради Буч. Объектно - ориентированный анализ и проектирование с примерами приложений на С++. - М.: Изд. Бином, Невский Диалект, 1998.

  5. А.В. Замулин. Курс лекций: ООП (С++, Ява, C#)

15 дәріс.

Тақырыбы: Төтенше жағдайлар механизмі және қателерді өңдеу

Дәріс мақсаты: төтенше жағдайлар механизмі түсінігімен танысу және оларды өңдеуді үйрену.

Кілттік сөздер: төтенше жағдайлар; төтенше жағдайлар синтаксисі; өңдеудің жалпы механизмі; қателерді өңдеу.

Жоспар:

  1. Төтенше жағдайларды өңдеу

  2. Жағдайды өңдеудің жалпы механизмі

  3. Төтенше жағдайдың синтаксисі

  1. Төтенше жағдайларды өңдеу

Жағдайларды өңдеу немесе жағдайлар – бұл туындауы апаратты дұрыс пайдаланбау нәтижесінде күтпеген апаттық жағдайлар орын алады. Мысалы бұл нольге бөлу немесе өндірістік жадыға айналдыру. Әдетте бұл оқиғалар программаның аяқталуына системалық хабарлама туралы қате шығарады. С++ программистке программаны қалпына келтіруге және оның жалғастыруына мүмкіндік береді.

Жабдықтау қателері немесе жөндеуді тоқтату С++ тілінде асинхронды жағдайын жөндеуді шығармайды, мысалы ctrl+c пернесін басқанда.

Механизм жағдайы программаның өзінің жұмыс нәтижесінде болатын және анық бейнемен көрсетілетін оқиғаларды анықтауға арналған. Жағдай егер кейбір программалар өзіне талап етілген нәрсені жасай алмаған жағдайда туындайды. Осыған байланысты басқа программа бөлімдері басқа нәрселерді жасауға тырысады. Жағдай сандық әдісті логикалық жағынан 2 бөлімге бөледі – апаттық жағдайдың пайда болуы және оларды өңдеу. Бұл өте жақсы программаның құрылымына ғана маңызды емес. Басты мәселе болып қатесі табылатын функция – жөндеуге арналған қабылдауларды білмеуі мүмкін, ал осы функцияны қолданатын не істеу керектігін білуі мүмкін, бірақ ол пайда болған орнын анықтай алмайды. Бұл көбінесе бірнеше модульдерден тұратын кітапханалық функциялар мен программаларды қолданған кезде белсенді болып келеді. Жағдайдың басқа мүмкіншіліктері функцияны шақырған кезде ақпаратты жіберуге арналған қате туралы қайтарылған мәндерді қабылдауды қажет етпеуден, параметрлерден немесе глобальды айнымалылардан тұрады, сондықтан да функцияның интерфейсі үзілмейді. Бұл көбінесе мысалы синтаксисі жағынан мәнді қайтара алмайтын конструкторлар үшін маңызды болып табылады.

Ескерту.Негізінде жағдай сапасын қарауға қателер ғана емес сонымен қатар мәліметті өңдеу кезінде туындайтын қалыпты жағдайлар да кедергі келтіре алмайды бірақ бұл басқа шешімдердің алдында өзінің жеке мүлігін иемдене алмайды және программаның құрылымын жақсарта алмайды.

  1. Жағдайды өңдеудің жалпы механизмі

Қате пайда болатын орын – try кілттік сөзі жазылған бақыланған блок болып табылатын құрама оператордың құрамына кіруі керек. Төменде төтенше жағдайларды өңдеу түрі қарастырылған:

  • Жағдайды өңдеу қате пайда болумен басталады. Пайда болған функция функция мәнді қайтарады. Ол үшін жағдайдың түрін анықтайтын параметрмен қоса throw кілттік сөзі қолданылады. Параметр тұрақты, айнымалы немесе обьект болуы мүмкін және оны өңдеу жағдайы туралы ақпаратты беру үшін қолданылады.

  • Жағдайдың сәйкес өңдеушісі ізделінді және оған бағыт беріледі.

  • Егер өңдеуші жағдайы табылмаса, онда ағымдағы процесті апатты аяқтайтын abort функциясын шақыратын terminate стандартты функциясы шақырылады. Процесті аяқтайтын өзінің жеке функциясын қондыруға болады. Кітаптың бірінші бөлімінде – (см раздел <<функций>>, с 73) стекке әрбір функцияны шақырған кезде локальды айнымалыларды сақтауға арналған жадының облысы және шақырылатын функцияға қайтарылатын адрес құрылады. Шақырылатын стек термині - әлі аяқталмаған шақырылған функцияның дәйектілігін анықтайды. Стектің айналымы болып – локальды айнымалылардан жадыны босату және шақырылатын функцияның бағытын қайтару процесін айтамыз. Функция аяқталған кезде табиғи стек айнымалы жүреді. Осы механизм жағдайларды өңдеуге де қолданылады. Бұл механизмді келесі бөлімде анығырақ қарастырамыз.

  1. Төтенше жағдайдың синтаксисі

Try кілттік сөзі мәнді генерациялайтын бақыланатын блок болып табылатын кодты анықтау үшін қолданылады. Блок фигуралық жақшаға алынып жазылады: try{…} try блогынан шақырылатын тура және ауыспалы барлық функциялар сондай ақ оған бағынышты болып есептеледі. Генерация жағдайы параметрмен немесе параметрсіз қолданылатын throw кілттік сөзінен throw[өрнек] throw сөзінен кейін тұратын өрнектің типі жағдайдың туындалатын типін анықтайды. Ағымдағы блокты орындау жағдайы генерациясы кезінде қатысып тұрған өңдеушіні іздеу және оған бағыт беретін жіберу орындалады. Ереже бойынша жағдай try блогында генерацияланады, ал функцияда тура және ауыспалы болады. Ішкі блокта пайда болатын жағдай әр уақытта тез өңделе бермеуі мүмкін. Бұл жағдайда бақыланған блогтар қолданылады және парметрсіз throw кілттік сөзінің көмегімен жоғары деңгейге дейін беріледі. Өңделетін жағдайдың типі жақшада жазылатын, catch кілттік сөзінен басталады. Олар true блогынан тәуелсіз орналасуы керек. Өңделетін жағдайдың типтерінің қатысуымен бір немесе бірнеше өңдеушілерді жазуға болады. Өңдеушілердің синтаксисі бір параметрмен анықталатын функцияны еске түсіреді – жағдай типі. Жазбаның үш формасы бар.

Catch (тип аты){.../* өңдеуші денесі*/}

catch (тип) {… /* өңдеуші денесі * /}

Catch (..) {… /* өңдеуші денесі*/}

Бірінші форма қандай да бір әрекеттерді орындауға арналған өңдеуші денесінде параметр аты қолданылғанда ауыстырылады – мысалы жағдай информацияны шығарғанда. Екінші форма жағдай туралы ақпаратты қолдануды болжай алмайды, оның типі ғана маңызды роль атқарады. Параметрдің орнына қолданған кезде өңдеуші барлық жағдайда алып жүреді деген мағынаны анықтайды. Өңдеушілер жазылған реті бойынша қарастырылады, ал үш типтегі өңдеуші қалғандарынан кейін орналастырылады. Мысалы:

Catch (int I ){

…// жағдайды өңдеу типі int

}

Catch (const char *) {

…// жағдайды өңдеу типі const char*

}

Catch (Overflow){

…// жағдайды өңдеу классы Overfow

}

Catch (…){

…// Барлық жағдайлардың қызмет етпеуі

}

Жағдайды өңдегеннен кейін бағыт жағдайдың өңдеушісінде табылатын бірінші операторға беріледі. Егер жағдай try блогында генерацияланбаса.

Ерекше жағдайларды ұстап қалу

Throw көмегімен генерацияланғанда функция С++ кітапханасы орындаушысын да келесі әрекеттерді орындайды.

  1. Жағдай өңделмейінше статикалық обьект түрінде тұратын throw параметрі көшірмесінен құрылады;

  2. Сәйкес келетін өңдеушіні іздестіру кезінде локальді образдардың деструкторларын шақыры өтіп, әрекет облыстарынан шығып стекке айналдырады.

  3. Өңдеушілерге осы обьектімен типі бойынша сәйкес келетін параметрге ие обьекті мен бағытты береді.

Стекті айналдыру кезінде барлық өңдеушілер әрбір ішкі блоктан сыртқыға өңдеушіге сәйкес келетін деңгейді таппайынша қарайды.

Өңдеуші ізделінді деп аталады, егер обьект типі throw сөзінен кейін орналасса:

  • Catch параметріне сілтенген (параметр t, const T& формасында жазылуы мүмкін, мұндағы T – жағдайдың типі

  • Catch параметрінде көрсетілген туынды болып табылады (егер мұрагерлік public кілттік сөзімен рұқсат етілсе)

  • Catch параметріндегі көрсеткіштің стандартты өзгерту ережесі бойынша өзгеруі мүмкін көрсеткіш болып табылады. Класстың туынды өндірушілері базаның өндірушілеріне дейін орналастырады, кері жағдайда оларға ешқандай бағыт берілмейді. Void типті көрсеткіштің өндірушісі автоматты түрде басқа типті көрсеткіштерді жасырады, сондықтан оларды нақты типті көрсеткіштердің өндірушілеріне дейін орналастыруға болады.

Мысал қарастырайық:

#include<fstream.h>

Class Hello{

// Өзінің құрылуы мен жоюлуында ақпарат бертін класс

Public:

Hello () { cout <<”Hello!”<<endl:}

~Hello () {cout <<”Bye!”<<endl:}

}:

Void f1(){

Ifstream ifs(“\\INVALID\\FILE\\NAME”) : // ФАЙЛДЫ АШУ

If (!ifs){

Cout<<”жағдайды генерациялау”<<endl;

Throw “файлды ашуда қате”:}

}

Void f2{

Hello H:// локальды обьектіні құрамыз”:}

F1(): Функцияны шақырамыз. Жағдайды генерациялау

}

Int main(){

Try{

Cout<<”try блокка кіреміз”<<endl:

F2():

Cout<<”try блоктан шығамыз<<endl:

}

Catch (int i){

cout<<”int қайта жөндеуді шақыру жағдайы – “<<i<<endl:

return -1;

}

Return 0; Бәрі сәтті аяқталды

}

Программаның нәтижесі:

Try блокка кіру

Hello!

Жағдайды генерациялау

Bye!

Қайта жөндеуді шақыру const char *. Жағдай – Файлды ашуда қате. Назар аударыңыз, жағдай туындағаннан кейін локальды обьектінің деструкторы шақырылған болады я болмаса f1 функциясынан шақырылған бағыт main функциядағы өңдеуге жіберілген болатын. Try – блоктан шығатын хабарлама толық шығарылмайды. Программада файлдармен жұмыс жасайтын топтар қолданылады. Механизм жағдайы қателік сетуациялардан шыққан кездегі обьектілерді жоюға мүмкіндік береді.Сондықтан ресурстың белгілеуі және жіберуі-класс түрінде безендіруге қолайлы,мұнда конструктор ресурсты белгілейді,ал деструктор жібереді.Мұнда мысал ретінде файлдарман жұмыс істейтін классты қарастыуға болады.Класстың конструкторы файлды ашады,ал деструктор жабады.Бұл жағдайда қате шыққан кезде файл жабылады және ондағы ақпаат жойылады деген кепілдік бар.Ескертіліп кететіндей жағдай қолданушының типіне оны қолданғандағы тәрізді стандартты түрде де болуы мүмкін,сондықтан оның типін анықтаудың қәжеті жоқ,мұнда жағдайдың туылған нүктесіне және оның өңделетін нүктесіне танымал болуы үшін глобальды типті таңдаса жеткілікті.

Бақылау сұрақтары:

  1. Төтенше жағдай дегеніміз не?

  2. Қателерді өңдеу қалай жүргізіледі?

  3. Төтенше жағдайлар синтаксисі қандай?

Әдебиеттер:

  1. Павловская Т.А. С и С++. Программирование на языке высокого уровня.

  2. Р. Лафоре. Объектно-ориентированное программирование в С++.4-е издание. Питер.2004

  3. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учебное пособие. – М.: Финансы и статистика, 2004

  4. Гради Буч. Объектно - ориентированный анализ и проектирование с примерами приложений на С++. - М.: Изд. Бином, Невский Диалект, 1998.

  5. А.В. Замулин. Курс лекций: ООП (С++, Ява, C#)