Curs C++ | Sectiunea 32 – Implementare POO Stack
In sectiunea anterioara am reusit implementarea unei stive folosind o abordare procedurala. Avem acelasi scop si de aceasta data, insa vom folosi o abordare orientata pe obiecte.
Clasa Stack – Membrii
💡 Ideea de baza ramane aceeasi. Folosim un vector pentru stocare si o variabila de tip int ce reprezinta stack pointer. Diferenta acum este ca vom plasa aceste variabile in interiorul unei clase. Ne vom referi la variabilele unei clase de acum incolo ca fiind membrii.
🥷🏻 Ne dorim insa sa ascundem acesti membrii, sa fie inaccesibili in afara clasei, altfel spus, sa ii incapsulam (encapsulate). Acest proces poarta si numele de privat (private). Privat va insemna ca numai clasa in sine, poate accesa si modifica membrii.
🕵️ Cand dorim sa marcam o parte din membrii unei clase ca private, trebuie sa adugam un keyword specific. Acesta mai poarta numele si de specificator de acces (access specifier) al unei clase.
📝 Pana in acest moment, keyword-ul private nu este neaparat necesar. In interiorul unei clase, cand nu specificam nicio optiune, se va presupune ca default private. Este mai bine insa sa fim mai exacti 🙂 .
Clasa Stack – Metode
💡 Este momentul sa adaugam si cele doua functii ale noastre, push si pop. Ne vom referi de acum incolo la functiile din interiorul unei clase ca fiind metode. O metoda poate fi descrisa in doua moduri diferite:
- in interiorul clasei – clasa contine o implementare totala a metodei
- in afara clasei – clasa contine doar header-ul (declararea), definirea fiind facuta in afara clasei
Ambele variante sunt corecte, depinde de fiecare cum doreste sa isi structureze codul. Noi vom aborda ambele variante. Implementam metoda pop in inteiorul clasei iar metoda push in afara.
🔓 Dorim sa invocam aceste metode astfel ca vor trebui sa fie accesibile oricarui utilizator al clasei (spre deosebire de membrii pe care i-am declarat anterior). Vom prezenta deci un nou specificator de acces numit public, rolul acestuia fiind cel evident.
In acest moment declararea clasei noastre este finalizata. Toate componentele au fost scrise, atat publice cat si private. Tot ce mai trebuie sa facem este sa definim metoda push.
❗ Metodele definite in afara clasei trebuie calificate folosind operatorul scope “::” dupa cum ati observat mai sus. In acest fel specificam exact catre ce functie facem referire si de cine apartine, asemanator cu modul de utilizare dintr-un name space.
Daca omitem prefixul respectiv, functia va fi considerata o functie normala, ca oricare alta, neavand nicio legatura cu, clasa Stack. Sintaxa generala de calificare ar fi astfel:
📝 De retinut, ambele metode au acces la membrii, chiar si privati, ai clasei. De asemenea, o componenta a unei clase este perfect vizibila celorlalte componente din clasa.
Clasa Stack – Constructor
Am putea spune ca suntem gata sa folosim clasa noastra insa nu este chiar corect. Spre exemplu, membrul nostru SP nu este initializat. Nefiind initializat, stiva noastra nu va functiona corect. Avem totusi o solutie pentru aceasta problema.
💡 Adaugam o nou metoda, fiind una foare specializata ce are rolul de a fi invocata de fiecare data cand un nou obiect de tip Stack este creat. Aceasta metoda poarta numele de constructor, fiind responsabil de constructia corespunzatoare a fiecarui obiect al clasei.
Spre deosebire de celelalte metode, pe aceasta nu o putem numi oricum dorim. Numele ii este determinat de insusi numele clasei, fiind acelasi.
❗ Mai mult, constructorii nu sunt metode reale. Nu au o valoare de return, nici macar void. Tineti cont de aceste aspecte in momentul definirii unei clase.
Clasa Stack – Creare Obiect
Suntem pregatiti sa folosim clasa noastra, alfel spus, sa cream obiecte de tip Stack.
💡 Observati ca am declarat o noua variabila, care de fapt este un obiect, numit my_stack si am specificat ca este de tipul Stack, ca si in cazul unei variabile normale.
De asemenea, modul de folosire al metodelor este identic cu cel specific unui string. Deoarece string este de fapt tot o clasa, precum si cea creata de noi.
Bineinteles, putem declara oricate obiecte dorim de acest tip, precum si in cazul unor variabile normale.
❓ Mai mult, am folosit pana acum doar metode publice, sa vedem ce s-ar intampla in cazul in care am dori spre exemplu sa modificam membrul SP.
❗ Compilatorul ne va atentiona imediat cu o eroare corespunzatoare ‘int Stack::SP’ is private within this context . Prin urmare, suntem siguri ca metodele sau membrii declarati ca privati nu pot fi accesati din exterior.
Aici se termina si aceasta sectiune insa noi inca nu am terminat povestea noastra despre clase si despre stiva tocmai creata 🙂 . Daca aveti intrebari suplimentare puteti folosi informatiile de aici.
➡ Sectiunea anterioara:Curs C++ | Sectiunea 31 – Implementare Procedurala Stack
➡ Sectiunea urmatoare:Curs C++ | Sectiunea 33 – Mostenire Clasa Stack

