Sari la conținut

[Programarea Orientata Pe Obiecte - C++] Supraincarcarea Operatorilor de Citire si Scriere


Postări Recomandate

  • Moderators
Postat

* 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!!,
 }


******/

 

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.

Vizitator
Din păcate, conținutul tău conține termeni pe care nu îi permitem. Te rugăm să editezi conținutul pentru a elimina cuvintele evidențiate de mai jos.
Răspunde la acest topic...

×   Inserat ca text bogat.   Restabiliți configurația implicită

  Doar 75 emoji sunt permise.

×   Linkul tău a fost încorporat automat.   Afișează ca link în schimb

×   Conținutul tău precedent a fost restaurat.   Curăță editor

×   Nu poți lipi imagini direct. Încarcă sau inserează imagini din URL.

  • Navigare recentă   0 membri

    • Nici un utilizator înregistrat nu vede această pagină.
×
×
  • Creează nouă...

Informații Importante

Termeni de Utilizare & Politică Intimitate