ОББН лекция 2. Си программалау тіліне кіріспе Жоспар
Скачать 128.11 Kb.
|
4. Класс жолдастарының сандарына шек қоюАлдыңғы тақырыптарда көрсетілгендей егер бір класс екінші класстың жолдасы ретінде сипатталса, онда жолдас класқа базалық кластың дербес элементтерін қолдануға мүмкіндік береміз. Бірақ, бұның бір келеңсіз жағы бар. Кластың жолдас кластары көп болған сайын программаға қате мәндердің берілуі, сөйтіп оның дұрыс жұмыс істемеуі жағдайы көбейе береді. Сондықтан, C++ тілінде кластың дербес элементтерін қолдануға жолдас кластың тек нақты функцияларына ғана рұқсат беруге болады. Мысалы, librarian класының, алдыңғы программада көрсетілген, әртүрлі функциялары бар. Бірақ солардың ішінде тек екі функцияға change_catalog және get_catalog ғана book класының дербес элементтерін қолдану қажет болсын. Сондықтан book класының ішінде біз, төменде көрсетілгендей, дербес элементтерді қолдануға осы екі функцияға ғана рұқсат береміз: class book { public: book(char*,char*,char*); voidshow_book(void); friendchar*librarian::get_catalog(book); friendvoidlibrarian::change_catalog(book*,char*); private: chartitle[64]; charauthor[64]; charcatalog[64]; }; Мұнда, friend операторларында дербес элементті қолдануға рұқсат беретін барлық жолдас функциялардың прототиптері көрсетілген. 5. Жолдас- функциялар Егер программада кластың дербес эдементтерін қолдану үшін жолдас кластар қолданылса, онда жолдас кластың дербес элементтерді қолданатын функция-элементтерінің санын жолдас функциялардың көмегімен шектеуге болады. Жолдас-функцияларды жариялау үшін friend қызметші сөзі жазылып,одан кейін функцияның толық прототипі көрсетіледі: public: friend class_name::function_name(parameter types); Сонымен, тек функция-элементтер ғана,жолдас ретінде көрсетілген, нүкте операторын қолданып кластың дербес элеметтерін қолдануға рұқсат алады. Егер кластардың анықталу реті дұрыс көрсетілмесе, онда программада бір кластың екінші класқа қатысты сілтемесі орындалмай қате кетуі мүмкін. Жоғарғы мысалда, book класы librarian класыда анықталған функциялардың прототиптерін қолданады. Сондықтан, librarian класы book класының алдында сипатталуы тиіс. Бірақ, librarian класының өзі, book класына сілтеме жасап отыр: class librarian { public: voidchange_catalog(book*,char*); char*get_catalog(book); }; Бірақ, біз book класын librarian класының алдына орналастыра алмаймыз. C++ программалау тілінде book класын жариялап, компиляторға хабар береміз, класс бар, оны кейінірек анықтаймыз: class book; // класты жариялау Төмендегі программада LIMITFRI.CPP жолдас функциялардың қолдану жағдайы көрсетілген. Мұнда кластардың анықталуына көңіл бөлу қажет: #include #include class book; class librarian { public: voidchange_catalog(book*,char*); char*get_catalog(book); }; class book { public: book(char*,char*,char*); voidshow_book(void); friendchar*librarian::get_catalog(book); friendvoidlibrarian::change_catalog(book*,char*); private: chartitle[64]; charauthor[64]; charcatalog[64]; }; book::book(char *title, char *author, char *catalog) { strcpy(book::title,title); strcpy(book::author,author); strcpy(book::catalog,catalog); } void book::show_book(void) { cout<<"Название:"< void librarian::change_catalog(book *this_book, char *new_catalog) { strcpy(this_book->catalog,new_catalog); } char *librarian::get_catalog(book this_book) { staticcharcatalog[64]; strcpy(catalog,this_book.catalog); return(catalog); } void main(void) { book programming( "Учимся программировать на C++", "Jamsa", "P101"); librarianlibrary; programming.show_book(); library.change_catalog(&programming,"ЛегкийC++101"); programming.show_book(); } Мұнда book класы кейіннен сипатталады деп көрсетілген. Сондықтан, компиляторға book класы кейіннен анықталады деп хабарлама түскеннен кейін, librarian класының анықтамасында book класына сілтеме жасауға болады. Қорыта келгенде: C++ тіліндегі программаларда кластың жолдас кластарын қолдану негізгі кластың элементтерін нүкте операциясы арқылы тікелей қолдануға мүмкіндік береді. Бір класты екінші бір кластың жолдасы ретінде (friend) жариялау үшін осы анықталатын кластың ішінде friend қызметші сөзінен кейін бірінші кластың атын жазып көрсетеміз. Жолдас класс жарияланған кейін онвң барлық функция-элементтері негізгі кластың барлық дербес элементтерін қолдана алады. Жолдас тәсілдердің сандарына шек қою үшін, дербес эдементтерді қолданатын, C++ тілінде жолдас функцияларды қолданамыз. Жолдас-функцияларды жариялау friend қызметші сөзі арқылы жүзеге асырылады одан кейін функция прототипі көрсетіледі. Жолдас-функциядарды жариялау барысында синтаксистік қателер кетуі мүмкін. Бқл әсіресе, кластарда анықтау ретіне байланысты болады. Егер компиляторға бұл класс кейін анықталады деп хабар беру қажет болса, онда class class_name типті операторларды қолдануға болады; |