Jump to content

[Programarea Orientată Pe Obiecte - C++] Supraîncărcarea Operatorilor de Citire și Scriere


Soulrayne
 Share

Recommended Posts

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 BZONE!!, \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 BZONE!!,
 }

{
ID Utilizator : 1 ,
Nume Utilizator : BINE AI VENIT PE COMUNITATEA BZONE!!! ,
Adresa Mail : BINE AI VENIT PE COMUNITATEA BZONE!!! ,
Parola Utilizator : BINE AI VENIT PE COMUNITATEA BZONE!!! ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE BZONE!!,
 }

{
ID Utilizator : 0 ,
Nume Utilizator : Alin ,
Adresa Mail : alin@gmail.com ,
Parola Utilizator : alipassword ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE BZONE!!,
 }
***/

 

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
	StringBZONE::allocAndFetchString(&user.username, bufferLine);
	printf_s("DATI-MI ADRESA DE MAIL:");
	input.getline(bufferLine, sizeof(bufferLine)); // Am preluat email de la tastatura 
	StringBZONE::allocAndFetchString(&user.email, bufferLine);
	printf_s("DATI-MI PAROLA DE UTILIZATOR:");
	input.getline(bufferLine, sizeof(bufferLine)); // Am preluat parola de la tastatura 
	StringBZONE::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 BZONE!!,
 }


******/
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.