Ierarhia claselor este o ierarhie conform principiului moștenirii, adică tip "acesta este un fel de asta". De exemplu, "muncitorul este un fel de persoană", "mașina" este un fel de "vehicul". În schimb, ierarhia obiectelor este o ierarhie bazată pe principiul apariției; tip "aceasta este o parte din asta". De exemplu, "instalația - o parte a instalației", "motorul" - o parte a "mașinii". Astfel, obiectele inferioare ale ierarhiei sunt incluse în obiecte de nivel superior, care sunt un grup pentru ele.
Iteratoarele vă permit să efectuați anumite acțiuni pentru fiecare element dintr-un anumit set de date.
Un astfel de ciclu ar putea fi făcută pentru întregul set, de exemplu, pentru a imprima toți membrii setului, sau s-ar putea să caute un element care îndeplinește o anumită condiție, caz în care acest ciclu se poate termina imediat ce elementul solicitat va fi găsit.
Vom lua în considerare iteratorii ca o clasă specială de metode de grup pentru a efectua o acțiune pentru toate obiectele incluse în grup. Un exemplu de iterator este metoda Show.
Am dori să avem un iterator care să permită efectuarea pe toate elementele grupului a acțiunilor specificate nu de una dintre metodele obiect, ci de o funcție arbitrară a utilizatorului. Un astfel de iterator poate fi implementat dacă această funcție este trecută printr-un pointer la o funcție.
Definiți tipul indicatorului la funcție după cum urmează:
typedef void (* PF) (TObject *,<дополнительные параметры>);
Funcția are un parametru obligatoriu de tip TObject sau TObject *. prin care se transmite un obiect, pentru care este necesară efectuarea anumitor acțiuni.
Metoda iterator este declarată după cum urmează:
void TGroup :: ForEach (acțiune PF,<дополнительные параметры>);
acțiune singurul parametru obligatoriu este un indicator al unei funcții care este apelată pentru fiecare element al grupului;
parametrii suplimentari Parametrii transferați la funcția apelată.
Apoi, un pointer de funcții este definit și inițializat la funcția trecută la iterator.
Apoi, iteratorul va fi apelat, de exemplu, pentru un parametru int suplimentar, astfel:
Aici gr este un grup de obiecte.
Identificarea dinamică a tipurilor.
Dinamica tipului de identificare este tipică pentru limbile în care se sprijină polimorfismul. În aceste limbi, sunt posibile situații în care tipul obiectului în etapa de compilare nu este cunoscut.
În C ++, polimorfismul este suportat prin ierarhii de clasă, funcții virtuale și indicatori către clasele de bază. În acest caz, pointerul clasei de bază poate fi folosit fie pentru a indica un obiect de clasă de bază, fie pentru a indica un obiect din orice clasă derivată din această clasă de bază.
Fie grupul să conțină obiecte de diferite clase și este necesar să se efectueze anumite acțiuni numai pentru obiectele unei anumite clase. Apoi, în iterator trebuie să recunoaștem tipul obiectului următor.
Standardul C ++ include instrumentele RTTI (Identificarea tipului de execuție) - identificarea dinamică a tipului. Aceste instrumente sunt implementate în cele mai recente sisteme Borland C ++ (versiuni 4.0 și versiuni ulterioare).
Informațiile despre tipul de obiect se obțin utilizând operatorul typeid, a cărui definiție conține fișierul antet
Există două forme ale operatorului tip:
Operatorul typeid returnează o referință la un obiect de tip type_info.
În clasa type_info, operațiile supraîncărcate == and! = Oferiți o comparație a tipurilor.
Funcția nume () returnează un pointer la numele de tip.
Există o limitare. Operatorul typeid funcționează corect numai cu obiecte care au funcții virtuale definite. Cele mai multe obiecte au funcții virtuale, chiar dacă distrugătorul este de obicei virtual pentru a elimina problemele potențiale cu clasele derivate. Atunci când un operator typeid este aplicat unei clase nepolimorfe (nu există nici o funcție virtuală în clasă), se obține un pointer sau o referință a tipului de bază.
Dacă la tipul inversiv (* p), p = NULL, excepția este ridicată bad_typeid
Ordinea lucrării.
1. Adăugați ierarhia claselor de lucrări de laborator nr. 2 cu clasele "grup".
De exemplu, pentru domeniul de activitate FACULTATEA poate oferi cursuri "facultate", "grup student", "departament". Se recomandă crearea unei clase abstracte "subdiviziune", care va fi strămoșul tuturor grupurilor și clasa abstractă TObject. care este în fruntea întregii ierarhii.
2. Scrieți o metodă iterator pentru grupul de clase.
3. Scrieți o procedură sau o funcție care este executată pentru toate obiectele care aparțin grupului (vezi exemplele din aplicație).
4. Scrieți un program demo în care obiectele de grup sunt create, afișate și distruse, iar utilizarea iteratorului este demonstrată.
1. Grupul de clasă trebuie să corespundă ierarhiei claselor de lucrări de laborator nr. 2, adică obiectele din aceste clase trebuie să aparțină grupului. De exemplu, pentru varianta 1, se poate propune următoarea ierarhie de clase:
Tobject (clasa abreviată)
Persoană (clasă abstractă) Subdiviziune (grup abstract)