Jump to content

Recommended Posts

  • Moderators
Posted

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


******/

 

  • Global-Moderators
Posted

Materialul este bine structurat, explicând clar conceptul de supraîncărcare a operatorilor prin exemple practice și teorie, dar poate fi îmbunătățit prin reducerea redundanței și uniformizarea tonului. 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

Terms of Use & Privacy Policy