Moderators NEFERPITOU Postat Sâmbătă la 15:54 Moderators Postat Sâmbătă la 15:54 * Obiective ** Prezentare si Implementare a mecanismului de supraincarcare a operatorilor de citire si scriere !! ** Prezentare ** Prin obiectele "cin" sau "cout" putem citi/afisa diverse tipuri de date (intregi,siruri de caractere,numere reale etc.) prin supraincarcarea operatorilor "<<" && ">>" . include <iostream> using namespace std; int main() { // cout , cin , endl --> SUNT OBIECTE // cout --> apartine clasei ostream (Pentru Afisare) --> S-a Supraincarcat Operatorul "<<" // cin --> apartine clasei istream (Pentru Citire) --> S-a Supraincarcat Operatorul ">>" cout << 5 + 7 << endl; // Asta ne afiseaza 12 } "cin" reprezinta obiect din clasa istream (de citire) ; "cout" reprezinta obiect din clasa ostream (de scriere) . Utilizand acest concept , putem sa ne construim pentru obiectele noastre , mecanisme personalizate(unice) pentru afisare (scriere "<<") si inserare (citire ">>") . Totusi , pentru a adapta citirea si scrierea pentru obiectele noastre , trebuie sa supraincarcam , in clasa noastra , atat operatori de citire(">>") cat si scriere ("<<") . ** Supraincarcarea Operatorului de Scriere ** Dorim sa efectuam o operatiune de afisare a obiectului folosind supraincarcarea operatorului "<<" Declam functia cu operatorul supraincarcat : // user.h class User{ /// Operatori friend std::ostream& operator<<(std::ostream& output,User& const user); // Operator de scriere } NOTA 1* : Primeste ca argument atat obiectul de scriere ("cout") din clasa "ostream" cat si obiectul din clasa noastra , pe care dorim sa l afisam !! NOTA 2* : Pentru ca foloseste un obiect strain (obiectul de afisat) , este necesar sa declaram functia ca fiind una prietena . SAU , o alta varianta (fara sa o declari prietena) ar fi sa o declari si implementezi in afara clasei . NOTA 3* : Se returneaza continutul pentru afisare . Urmeaza implementarea acestuia : // user.cpp std::ostream& operator<<(std::ostream& output, User& const user) { // DOAR AFISAM CAMPURILE OBIECTULUI output << "\n{" << "\nID Utilizator : " << user.id << " ,\n" // Acces ID FARA GETTER << "Nume Utilizator : " << user.username << " ,\n" // Acces Username FATA GETTER << "Adresa Mail : " << user.email << " ,\n" // Acces Email FARA GETTER << "Parola Utilizator : " << user.password << " ,\n" // Acces Parola FARA GETTER << "Numar Posturi : " << user.nrPosts << ", \n" // Acces la Nr Posturi FARA GETTER << "STATUS BANAT : " << (user.isBanned ? "ESTE INTERZIS " : "NU ESTE INTERZIS") << " PE LEAGUECS!!, \n }"; return output; // Returnam obiectul de afisat } In final , afisam in programul principal , trei obiecte : #include "User.h" // Includem Clasa de Utilizatori int main() { User user1("Alin", "alin@gmail.com", "alipassword"), user2, user3(user1); // Declaram 3 obiecte (unu implicit , unu explicit , unu clona) . std::cout << user1 << '\n' << user2 << "\n" << user3 << "\n"; } /*** AFISAJ { ID Utilizator : 0 , Nume Utilizator : Alin , Adresa Mail : alin@gmail.com , Parola Utilizator : alipassword , Numar Posturi : 0, STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!, } { ID Utilizator : 1 , Nume Utilizator : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! , Adresa Mail : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! , Parola Utilizator : BINE AI VENIT PE COMUNITATEA LEAGUECS!!! , Numar Posturi : 0, STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!, } { ID Utilizator : 0 , Nume Utilizator : Alin , Adresa Mail : alin@gmail.com , Parola Utilizator : alipassword , Numar Posturi : 0, STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!, } ***/ ** Supraincarcarea Operatorului de citire ** Per asamblu , implementarea este , oarecum , similara cu cea de sus , difera prin faptul ca se efectueaza o operatiune inversa a acelei de sus . Declaram functia de citire in interiorul clasei : // user.h #include <stdio.h> // Pentru afisare la fiecare camp class User{ // Restu Codului /// Operatori Citire & Scriere friend std::ostream& operator<<(std::ostream& output,User& const user); // Declaram Operatorul de Scriere friend std::istream& operator>>(std::istream& input, User& user); // Declaram Operatorul de Citire // NOTA ** : NU ESTE REFERINTA CONSTANTA DEOARECE MODIFICAM DATELE OBIECTULUI !!! } Implementare Operator de Citire , folosind continutul de la tastatura : std::istream& operator>>(std::istream& input, User& const user) { char bufferLine[64]; // Continut temporar (Pana la 64 de caractere) printf_s("DATI-MI NUMELE DE UTILIZATOR:"); input.getline(bufferLine, sizeof(bufferLine)); // Am preluat numele de la tastatura StringLGCS::allocAndFetchString(&user.username, bufferLine); printf_s("DATI-MI ADRESA DE MAIL:"); input.getline(bufferLine, sizeof(bufferLine)); // Am preluat email de la tastatura StringLGCS::allocAndFetchString(&user.email, bufferLine); printf_s("DATI-MI PAROLA DE UTILIZATOR:"); input.getline(bufferLine, sizeof(bufferLine)); // Am preluat parola de la tastatura StringLGCS::allocAndFetchString(&user.password, bufferLine); printf_s("DATI-MI NUMARUL DE POSTURI :"); input.getline(bufferLine, sizeof(bufferLine)); // Am preluat numarul de posturi user.nrPosts = atoi(bufferLine); // Convertim si atribuim numarul de posturi printf_s("ESTE BANAT?(da/nu)"); input.getline(bufferLine, sizeof(bufferLine)); // Preluam daca este banat sau nu if (!strcmp(bufferLine, "da") || !strcmp(bufferLine, "yes")) // Daca avem una dintre aceste doua variante user.isBanned = true; // E BANAT else user.isBanned = false; // ALT INPUT return input; } Pe final , citim (de la tastatura) si afisam un obiect : #include "User.h" // Includem Clasa de Utilizatori int main() { User user1("Alin", "alin@gmail.com", "alipassword"), user2, user3(user1); // Declaram 3 obiecte (unu implicit , unu explicit , unu clona) . // Aplicam la al doilea obiect (cel implicit) , o inserare prin tastatura std::cout << "INSERAM DATELE UTILIZATORULUI : " << std::endl; std::cin >> user2; // CITIM OBIECTUL std::cout << user2; // AFISAM OBIECTUL } /******** REZULTAT INSERAM DATELE UTILIZATORULUI : DATI-MI NUMELE DE UTILIZATOR:ALIN DATI-MI ADRESA DE MAIL:alin.ngr@gmail.com DATI-MI PAROLA DE UTILIZATOR:ALINPAROLA DATI-MI NUMARUL DE POSTURI :43 ESTE BANAT?(da/nu)da { ID Utilizator : 1 , Nume Utilizator : ALIN , Adresa Mail : alin.ngr@gmail.com , Parola Utilizator : ALINPAROLA , Numar Posturi : 43, STATUS BANAT : ESTE INTERZIS PE LEAGUECS!!, } ******/ Citează
Postări Recomandate
Alătură-te conversației
Poți posta acum și să te înregistrezi mai târziu. Dacă ai un cont, autentifică-te acum pentru a posta cu contul tău.