Програмистите Club - - материали на Delphi и - блог архив - Урок 28
Както вече знаете, програмата ви да получите достъп до частни (частни) членовете на класа само с функционални елементи от същия клас. С помощта на частни членове на класа, вместо генерала във всички ситуации, където е възможно, ще се намали възможността на програмата да развалят стойността на членовете на класа, тъй като програмата може да включва елементи само чрез функциите на интерфейса (които контролират достъпа до частните елементи). Въпреки това, в зависимост от използването на обекти в програмата си, понякога можете значително да се повиши ефективността, като позволява на един клас да имат директен достъп до частните елементи на другия. В този случай, намалените разходи (задължително по време на работа), за да се обаждат функциите на интерфейса. В тези C ++ ситуации за определяне на класа като приятел (приятелка> от друг клас и дава възможност за класа друг достъп до частните елементи от различен клас. В този урок обяснява как вашата програма може да се посочи, че двете категории са приятели. До края на този урок овладяване на следните основни понятия:
- С помощта на приятеля дума Е, този клас може да каже C ++, който е негов приятел, т. Е. С други думи, че останалите класове могат да кандидатстват директно за частните му елементи.
- Частни членовете на групата за защита на класа на данни, така че трябва да се ограничи обхватът на класни приятели само тези класове, които наистина се нуждаят от директен достъп до частни елементи на желания клас.
- C ++ позволява да ограничите достъпа до определен набор от лесни за използване функции.
Частни (частни) елементи позволяват да се защити класове и да се намали вероятността от грешки. Следователно, трябва да се ограничи използването на класни приятели, колкото е възможно. Понякога програмата можете директно да промените стойностите на един клас от елементи, това увеличава вероятността от грешки.
ОПРЕДЕЛЯНЕ НА ПРИЯТЕЛИ КЛАС
C ++ позволява приятели на определен достъп клас частни членове на този клас. За да посочите C ++, че един клас е приятел (приятелка) от друг клас, просто се слага ключовата дума на съответния клас, друг приятел и име вътре в дефиницията на друг клас. Например, тази книга клас декларира клас библиотекар приятел. Ето защо, най-висока класа библиотечни обекти могат да имат директен достъп до частни елементи на една книга клас, с помощта на оператора на точка:
публичния:
книга (Чар *, знак *, знак *);
невалидни show_book (свободен);
приятел библиотекар;
лично:
овъгляване заглавието [64];
овъгляване автор [64];
овъгляване на стоките [64];
>;
Както можете да видите, за да покаже, други нужди само едно изявление вътре дефиницията на класа. Например следната програма използва VIEWBOOK.CPP библиотекар като друг клас книга. Следователно клас библиотечните функции могат да имат директен достъп до частни елементи на една книга клас. В този случай, програмата използва функция на класа Библиотекарят change_catalog да промените номера на картотека за определена книга:
публичния:
книга (Чар *, знак *, знак *);
невалидни show_book (свободен);
приятел библиотекар;
лично:
овъгляване заглавието [64];
овъгляване автор [64];
овъгляване на стоките [64];
>;
книга :: книга (Чар * заглавие, знак * автор, знак • каталог)
strcpy (книга :: заглавие, заглавие);
strcpy (книга :: автор, автор);
strcpy (книга :: каталог, каталог);
>
публичния:
нищожен change_catalog (книга *, знак *);
Чар * get_catalog (книга);
>;
нищожен библиотекар :: change_catalog (книга * this_book, знак * new_catalog)
Чар * библиотекар. get__catalog (книга this_book)
статичен овъгляване на стоките [64];
strcpy (каталог, this_book.catalog);
се върне (каталог);
>
книга за програмиране ( «програма за обучение в C ++ език», «Ясма», «P101»);
библиотекар библиотека;
programming.show_book ();
library.change_catalog (програмиране, «Light C ++ 101");
programming.show_book ();
>
Обикновено единственият начин, чрез който вашата програма може да получите достъп до частни елементи на класа, е да се използват функциите на интерфейса. В зависимост от обектите на приложни програми, понякога може да бъде удобно (или по-ефективна по отношение на скоростта компютри), за да позволи на един клас за достъп до частни елементи на другия. За да направите това, вие трябва да информира C ++ компилатор, че класът е приятел (приятелка). Компилаторът на свой ред позволи на други класове, за да имате достъп до определени елементи на класа. За да се декларира клас приятел, сложи приятеля ключова дума и името клас-приятел в публичната част на дефиницията на класа, както е показано по-долу:
Като приятели се различават от защитени (защитени) елементи
От урок 26 научихте, че в C ++, там са защитени (защитени) елементи на класа, която позволява получени класове за достъп до защитени членове на базовия клас директно, използвайки оператора на точка. Не забравяйте, че защитените елементи на класа могат да имат достъп само тези класове, които са получени от този базов клас, с други думи, класовете, които наследяват от членовете на базовия клас (защитени елементи на класа са като лично към останалата част от програмата). Класове C ++ приятели обикновено не са свързани чрез връзки на последователност. Единственият начин за такива несвързани класове, за да имате достъп до определени елементи от друг клас, е на този друг клас информира компилатора, че този клас е приятел.
Ограничаване на броя на ПРИЯТЕЛИ
Както току-що сте научили, ако се декларира клас приятел на друг клас, която предоставяте в класа си приятел достъп до частни елементи от данни на друга класа. Вие знаете също така, че колкото повече достъп до личните данни на класа, толкова по-вероятно да се правят грешки в програмата. Следователно, ако достъп до лични данни от друг клас, изисква само няколко функции на класа, C ++ позволява да се уточни, че само някои лесни за използване функции на класа ще имат достъп до частни елементи. Например, да предположим, че библиотекар класа, представени в предишната програма, съдържа много различни функции. Въпреки това, предполагам, че само функции change_catalog get_catalog и се нуждаят от достъп до частните елементи на една книга клас. Вътре книга дефиниция клас, може да ограничи достъпа до частните елементи на само две функции, както е показано по-долу:
публичния:
книга (Чар *, знак *, знак *);
невалидни show_book (свободен);
приятел Чар * библиотекар :: get_catalog (книга);
приятел невалидни библиотекар. change_catalog (книга *, знак *);
лично:
овъгляване заглавието [64];
овъгляване автор [64];
овъгляване на стоките [64];
>;
Както можете да видите, приятел E изявление съдържа пълни прототипи на всички приятелски функции, които могат да имат директен достъп до частни елементи.
Само функционира елементи, изброени като приятели, може да имат директен достъп до частните елементите на един клас с помощта на оператора на точка.
Ако вашата програма започва да се обърнете към един клас от друго, можете да получите синтактична грешка, ако по реда на дефинициите на класа, е неправилно. В този случай, книгата на определение клас използва функционални прототипи, определени в библиотекар клас. Ето защо, клас определение библиотекар трябва да предхожда определение книга клас. Все пак, ако се анализира клас библиотекар, вие ще откриете, че тя се отнася към класа на книга:
публичния:
нищожен change_catalog (книга *, знак *);
Чар * get_catalog (книга);
>;
Тъй като не може да постави дефиницията на книга клас, преди определянето на библиотекаря клас, C ++ позволява да се декларира клас книга, като по този начин информиране на компилатора, че този клас е, и след това да го определи. Следната таблица показва, как да го направите:
Следващият Програмата използва LIMITFRI.CPP приятелски функции за библиотекаря клас ограничи достъпа до лични данни от книга клас. Обърнете внимание на реда на дефинициите на класа:
публичния:
нищожен change_catalog (книга *, знак *);
Чар * get_catalog (книга);
>;
публичния:
книга (Чар *, знак *, знак *);
невалидни show_book (свободен);
приятел Чар * библиотекар :: get_catalog (книга);
приятел невалидни библиотекар :: change_catalog (книга *, знак *);
лично:
овъгляване заглавието [64];
овъгляване автор [64];
овъгляване на стоките [64];
>;
книга :: книга (Чар * заглавие, знак * автор, знак * каталог)
strcpy (книга :: заглавие, заглавие);
strcpy (книга :: автор, автор);
strcpy (книга :: каталог, каталог);
>
нищожен библиотекар :: change_catalog (книга * this_book, знак * new_catalog)
Чар * библиотекар :: get_catalog (книга this_book)
статичен овъгляване на стоките [64];
strcpy (каталог, this_book.catalog);
се върне (каталог);
>
програмиране книга ( «програма за обучение в C ++", "Ясма», «P101»);
библиотекар библиотека;
programming.show_book ();
library.change_catalog (програмиране, «Light C ++ 101");
programming.show_book ();
>
Какво е идентификатор на класа
Тази линия казва на компилатора, че вашата програма по-късно ще определи определен клас, толкова дълго, тъй като програмата е позволено да се обърнете към този клас.
КАКВО ТРЯБВА ДА ЗНАЕТЕ
В този урок научихте как да използвате класове-приятели, за да имате достъп до определени елементи от друг клас, директно с помощта на оператора на точка. В урок 29 ще се научите как да използвате C ++ функционални шаблони за опростяване на определянето на тези функции. Но преди да преминат към Урок 29, уверете се, че сте усвоили следното: