ПредишенСледващото

Включително обекти.

Има два варианта да се включват X тип обект в клас А:

  1. Установи, клас А член на тип X;
  2. Декларирам клас А член на тип X * или X.

За предпочитане включва действителното обект в първия случай. Това е по-ефективен и по-малко податливи на грешки, тъй като връзката между обектите, съдържащи се и след като описа строителните правила и унищожение.

Вторият вариант може да се използва с показалеца, когато за целия живот на "съдържащ" обекта, който искате да промените на курсора в ", съдържащ" обект.

Вторият вариант може да се използва, когато искате да попитате ", съдържаща" обект като аргумент.

С обекти, включително други елементи, ние създаваме йерархия на обекти. Това е алтернатива и комплементарна на йерархията на клас. Какво става, когато трябва да бъдат включени броя на обектите не е предварително известна и (или) може да се променя по време на жизнения цикъл на "съдържащ" на обекта. Например, ако обектът съдържа ученици, броят им може да варира.

Има два начина за решаване на този проблем. Първата е, че свързан списък организиран включени обекти, както и "съдържащ" обект е член тройка в началото на този списък.

В този случай, обекта ще бъде създадено училище създава празен списък с включени съоръжения. метод добави () се нарича за включването на даден обект. които като параметър е указател към обекта да бъдат включени. Destructor последователно премахва всички елементи, включени. Лице обект се състои от следващата област. който ви позволява да свържете обекти към списъка.

Вторият метод е да се използва специален контейнер обект.

Класът контейнер е предназначен за съхранение на предмети и е удобен лесен и удобен начин за достъп до тях.

Заедно с контейнери съществува група, т.е. обекти, които да включват и други обекти. Обекти в рамките на една група, група, наречени елементи. Елементи на групата, от своя страна, също могат да бъдат група.

  1. Прозорец към интерактивна програма, която има елементи като полета за въвеждане и редактиране на данни, бутони, списъци за избор, диалоговите прозорци и т.н.
  2. Устройството се състои от малки единици.
  3. Зеленчукова градина, състояща се от растения, напоителни системи и план за отглеждане.
  4. Определен организационна структура (например, отдели, универсални, студентски групи).

Концепцията за "група" на "контейнер" са различни. Контейнерът се използва за съхранение на данни и други. Пример контейнери: контейнер клас обекти в STL C ++ (масиви, списъци, опашки).

За разлика от групата на контейнера е класа, която не е само съхранява обекти от други класове, но също така има своите качества, а не в резултат от свойствата на елементите му.

Група дава втори изглед в йерархията (първи вид - клас йерархията изградена на базата на наследство) - обект йерархия (йерархия число тип / част), изградени на базата на агрегация.

Прилагане група по няколко начина:

  1. Клас "група" поле тип обект съдържа данни. По този начин, обект "група" като данните съдържа елементите, или пряко, или указатели към тях Такъв метод се използва при прилагането на групата C ++ Builder.
  2. Група съдържа член на този последен тип TObject *. което показва началото на свързан списък на обекти, включени в групата. В този случай, обектите трябва да бъдат в непосредствена близост поле от тип TObject *. сочи към следващия елемент в списъка.
  3. Създаване на свързан списък структури тип TItem. полеви елемент сочи към обект, включени в групата. Последно група съдържа поле от тип TItem *. което показва началото на свързан списък структури тип TItem. Ако имате нужда от достъп елементи на неговите полета и методи, обект от тип TObject трябва да има тип TGroup полето собственик *. който показва на собственика на този елемент.

Има два метода, които са необходими за функционирането на групата:

Притурки елемент група.

Освен това, групата може да включва следните методи:

Той показва дали има поне един елемент в групата.

Той премахва елемент от групата, но тя съхранява в паметта.

Премахва елемент от групи и от паметта.

Итераторите ви позволяват да извършвате определени действия за всеки елемент на даден набор от данни.

Такъв цикъл може да се направи за целия набор, например, е да отпечатате всички елементи на набор, или може да се търси елемент, който отговаря на определени условия, като в този случай този цикъл може да се прекрати веднага след като исканата вещ ще се намери.

Ще разгледаме итератори като специален клас от методи на групата да извърши някакво действие за всички обекти, включени в групата. Пример за итератор е метод за Show.

Бихме искали да имаме такова итератор, който позволи да пренесе всички елементи на мярката, не е един от методите на даден обект, и произволен потребител функция. Това итератор може да се реализира, ако функцията, за да го предавате чрез показалеца функция.

Ние дефинираме тип функция показалеца, както следва:

Функцията има необходимата параметър от тип TObject или TObject *. чрез която се прехвърля към обекта, за който искате да изпълните определени действия.

метод Итераторът е обявена, както следва:

когато действието - единственият параметър задължително-указател към функция, която се нарича за всеки член на групата; допълнителни параметри - параметри, подавани към нарича функция.

На следващо място, показалеца функция и се инициализира с предава функцията итератор.

Тогава Итераторът ще се нарича, например, за допълнителен параметър от тип Int. както следва:

Има GR - обектно-група.

Помислете за връзката между наследството и включване.

Включване и наследство.

Нека клас D е получен клас клас Б.

Публична дума в заглавието на клас D казва за общественото наследство. Open наследство означава, че получени клас D е подтип на клас Б. т.е. D обект е обект В. Това е съотношението на наследство е-а или се каже, че D е форма на D. Това понякога е наричан също интерфейс наследяване. Когато са отворени наследство получен променлива клас може да се счита като променлива на тип база клас. Стрелката, вида от които - "указател към базовия клас" може да показва предмети, които имат вид на извлечения клас. Използването наследство, ние изграждаме клас йерархия.

Да разгледаме следния клас йерархия.

Определяне на указатели към обекти от тези класове.

Ще създаде обекти на тези класове.

Сега предполагам, че клас D е член на клас B.

Клас B Клас C е член на свой ред.

Това се нарича включване има-превключвател връзка Използването ние изграждаме йерархия на обекти.

На практика това е проблемът за избор между наследството и включване. Помислете за клас "Самолетът" и "Мотор". Новодошлите често идва да направи главата "Самолет" произлиза от "двигател". Това не е вярно, защото на самолета не е двигателят, той има мотор. Един от начините да се види това- обмисли дали самолетът може да има няколко двигатели? Тъй като е възможно, ние трябва да използваме включване, а не наследство.

Да разгледаме следния пример:

Защо в грешки линии # 1 и # 3?

В съответствие # 1 не превръщане на D * B *.

В съответствие # 3 не е член D д ().

За разлика от общественото наследство, не е имплицитно преобразуване от един клас на един от своите членове, както и клас, съдържащ член на друга класа, не заменя виртуални функции на класа.

Ако Class D използват обществения наследство

Тя не съдържа грешки.

Тъй като D е получен от клас Б. след имплицитно преобразуване от D до Б. Последствието е повишен зависимостта между В и D.

Има моменти, когато ви харесват наследство, но не могат да си позволят такава трансформация.

Например, ние искаме да се използва един и клас код база, но не очаквайте да се помисли извлечен клас обект като например на основата. Всичко, което искаме от nasledovaniya- е код повторна употреба. Решението тук е лично наследство. Лично наследство не е с такъв характер, подтип, или връзката е-а. Ние я наричаме отношението като-а (нещо подобно) или наследство изпълнение, за разлика от интерфейса наследство. Затворена (както и защитени) наследяване не създава йерархията тип.

От дизайнерска гледна точка частното наследство, еквивалентен на включването, с изключение на проблема с функции за подмяна. Важен прилагане на такава podhoda- общественото наследство от абстрактен клас, а в същото време е затворен (или защитена) наследи от определен клас за представяне на изпълнението.

Пример. Binary търсене дърво

Възлите на бинарна дърво съдържат общ указател към информация на данните. Това ще съответства на индикатора на типа на извлечен клас. Брой поле съдържа броя на случаи на повтарящи се данни. За специално получен клас, трябва да напише функция на съединение за сравняване на стойностите на определен тип производно. вмъкнете () функция поставя възлите в дървото.

Функция TP находка (Node * R, TP г) търси поддървото с корен г на информация, предоставена г.

печат () функция - стандартен рекурсия да преминават двоично дърво

На всеки възел, външният функция се прилага. печат ().

Сега създайте извлечен клас, че като член на данни има указатели към Чар.

В клас StringTree вложка функция използва абсолютни Чар * превръщане да анулира *.

сравняване съединение функция е както следва

За получаване на стойности, запаметени в възел, с помощта на външна функция

Тук изрично да хвърли нищожен * до въглен * използваме, за да донесе вида операция (тип-име) израз. По-надежден е операторът на употреба static_cast (ТР).

множествено наследяване

А клас може да има повече от един незабавни базови класове

Това се нарича множествено наследяване. Когато няма множествено наследяване клас не може да се използва повече от веднъж като пряк база. Въпреки myzhet клас повече от веднъж, за да бъде индиректно базов клас.

Имаме следната йерархия на класове (и обекти):

Такова дублиране клас съответства на включването в получен обект obeatov няколко база клас. В този пример, има два класа обект X. За да се елиминират евентуални неясноти се наложи да преминете към конкретен елемент от клас Х, като се използва пълен квалификация

За да се премахне дублирането на косвените обекти на множествено наследяване на базовия клас, базов клас декларира виртуална.

Сега клас А ще включва само едно копие на X, достъп до които са ravropravno klassy Y и Z.

тук
  • База клас обект е в памет на 15 байта:
    • 4 байта - INT област;
    • 2 байта - Чар област;
    • 10 байта - поле овъгляване [10];
  • Смири клас обект заема 79 байта в паметта:
    • 8 байта - двойна област;
    • 15 байта - полетата на базата на базовия клас;
    • 2 байта - да общуват във виртуална класна стая ierfrhii;
  • BBase клас обект е в памет на 21 байта:
    • 4 байта - поплавък област;
    • 15 байта - полетата на базата на базовия клас; 2 байта - да общуват в йерархията на виртуални класове;
  • Топ клас обект заема 35 байта памет ч:
    • 4 байта - дълго поле;
    • 10 байта - данни и комуникации смири;
    • 6 байта - davnye и комуникация BBase;
    • 15 байта - полетата на базата на базовия клас;

Ако наследство база в класове и смири BBase базовия клас не виртуално, а след това rezultatb са както следва:

  • База клас обект е в памет на 15 байта
  • Смири клас обект заема 26 байта памет (№ 2 байта за комуникация);
  • BBase клас обект заема 59 байта памет (№ 2 байта за комуникация);
  • obekv Топ клас е в памет на 46 байта (Base обект се появява два пъти).

Местните и вложени класове

А клас може да бъде обявена в блок, например, в рамките на дефиницията на функцията. Такъв клас се нарича местно. Локализация клас предполага липсата на неговите компоненти е поле определение клас (външно тяло).

Местна клас не може да има статични данни, както местни компоненти клас не могат да се определят извън класа на текст.

Вътре местен клас е позволено да я използвате от областта на околната среда само да напишете имената, статични (статични) променливи, външни (Външните) променливи и външни функции на елементите, изброени. От това, което е забранено, е важно да се отбележи, автоматични променливи памет. Ruschestvuet друг важен ограничение за lokalnyw класове - техните функции компоненти могат да бъдат само в текста.

В рамките на този клас се оставя да се определят видовете, следователно, един клас може да бъде описан в друга. Такъв клас се нарича вложени. Вложени клас е местно към класа, в който е описано, и тя разширява обхвата на тези правила за използването на местен клас, който goporilos по-горе. Трябва да се подчертае, за да се каже, че вложено клас няма права за wsobogo на членовете на класа, обвивката, което означава, че може да се отнасят до тях само чрез вида на обекта на този клас (както и покриване на класа няма никакъв специален достъп до вложените класа ).

Пример. Клас "правоъгълник".

Ще дефинираме "кутия" клас. В рамките на този клас дефинираме класа като вложено клас "сегмент". Правоъгълникът се състои от сегменти.

Използването на тази техника, може да определи всеки геометричен fuguru състояща се от права линия сегменти.

String клас съхранява масив от символи нулев прекратени с низ C-стил и използва референтен механизъм броене за свеждане до минимум iperatsy копие.

Класът String използва три помощни класове:
  • StringRepeater. която позволява обмен на информация между няколко виртуални представителство от тип String обект с едни и същи ценности;
  • Range - за генериране на изключение в случай на извън обхват;
  • Референтен - за изпълнение на операцията за индексиране, което прави разлика между четене и запис.

Както и други членове на вложените класа могат да бъдат обявени в класа, и са посочени.

Класът String предоставя общ набор от конструктори, деструктори, и оператори за присвояване.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!