Sari la conținut

Postări Recomandate

  • LCS PREMIUM
Postat

** Organizarea Claselor **

Cu cat proiectul primeste mai multe implementari , spre exemplu : mai multe clase , mai multe functii samd. , cu atat acesta devine mai greu de citit . In acest context , a aparut necesitatea de a organiza clasele pe mai multe fisiere . Pentru fiecare clasa , se constituie doua fisiere :

  • unu de tip antent sau "header" ce detine declaratiile clasei si a componentelor acestuia . 
  • unu de tip sursa ce detine implementarile(functionalitatile) declarate.  

NOTA ** : Aceasta abordare ne confera o LIZIBILITATE mai buna a codului . (O intelegere mai buna a codului prin redimensionarea liniilor de cod la fiecare fisier) . Practic , mai bine preferam 6 fisiere cu cate 50 de linii de cod decat un fisier cu 300 . 

** Exemplu  ** 

Sa presupunem ca avem proiectul nostru de POO (Programarea Orientata Pe Obiecte) , codul fiind incapsulat intr-un singur fisier .  Scopul acestui tutorial , va fi de a impartii acele linii de cod pe mai multe fisiere . (Ne va ajuta in tutorialele urmatoare cand vom complica lucrurile !!) 

1. Declaram o clasa ce manipuleaza siruri de caractere (pentru alocarea sirurilor de caractere) : 

// StringLGCS.h 

#pragma once

#include "string.h" // Pentru strcpy

/// MANIPULATOR DE SIRURI DE CARACTERE 


class StringLGCS {

private:

	char* string;


public:
	StringLGCS();
	StringLGCS(const char* source); 
	~StringLGCS();

	// Getteri 

    char* const getString();

	// Setteri 

	void setString(const char* source);


	// Alte Functii  

	static inline void allocAndFetchString(char** target, const char* source); // E INDEPENDENT DE INSTANTE 

};

Cu implementarea : 

// StringLGCS.cpp

#include "StringLGCS.h" // Asociem cu fisierul antent 

// Implementari 

StringLGCS::StringLGCS() // Constructor Default 
{
	const char* defaultLGCSString = "BINE AI VENIT PE COMUNITATEA LEAGUECS!!!";

	allocAndFetchString(&this->string,defaultLGCSString);
   
}

// Constructor cu Parametrii 

StringLGCS::StringLGCS(const char* source)
{
	allocAndFetchString(&this->string,source);
}



// Destructor 

StringLGCS::~StringLGCS()
{
	// Eliberam memoria ocupata de sir 
	delete string;
	string = NULL; 
}

// Getteri && Setteri 

 char* const StringLGCS::getString()
{
	return string;
}

void StringLGCS::setString(const char* source)
{
	delete this->string; // Stergem 
	allocAndFetchString(&string,source); // Realocam pentru alt sir de caractere
}

inline void StringLGCS::allocAndFetchString(char** target, const char* source)
{
	size_t sizeTarget = strlen(source) + 1;
	*target = new char[sizeTarget]; // Alocam Spatiu pentru sir de caractere 
	strcpy_s(*target, sizeTarget, source);
}


// Alte Functii 

2. Adaugam Clasa de Utilizatori : 

#pragma once
// User.h --> Fisier Antent


#include "StringLGCS.h" 
#include <iostream>


// CLASA CU DECLARATIA MEMBRIILOR 
class User
{
private:  // Sector Privat 
	// Campuri 
	unsigned id;  // NUMAR NATURAL
	char* username; // SIR DE CARACTERE
	char* email; // SIR DE CARACTERE 
	char* password; // SIR DE CARACTERE
	unsigned nrPosts; // NUMAR NATURAL 
	bool isBanned; // E BANAT

	StringLGCS* stringHandling; // Manipuleaza Siruri de Caractere . 

public:  // Sector Public 

	/*
	*   CONSTRUCTORI
	*/

	User(); // Constructor fara parametrii 
	User(unsigned id, const char* username, const char* email, const char* password); // Constructor cu toti parametrii 

	/*
		DESTRUCTOR
	*/
	~User();

	/*
		GETTERI
	*/

	unsigned const getId();
	const char* const getUsername();
	const char* const getEmail();
	const char* const getPassword();
	unsigned const getnrPosts();
	bool const getisBanned();
	/*
	  SETTERI
	*/

	void setNrPosts(const unsigned nrPosts);
	void setIsBanned(const bool isBanned);
	void setUsername(const char* username);
	void setEmail(const char* email);
	void setPassword(const char* password);


	// Alte Functii 

	// Vizualizare Obiect 

	void objectToString();  // Transferam obiectul prin referinta constanta

};

Cu implementarea : 

#include "User.h"

//** Implementarea Constructorilor **//


User::User() { // Constructor Fara Parametrii 

	// Alocam si Initializam date cu informatii IMPLICITE (DEFAULT )

	// Variabile cu Alocare Statica 
	id = 0;
	nrPosts = 0;
	isBanned = false;

	// Variabile cu Alocare Dinamica 

	stringHandling = new StringLGCS(); // E initializat cu o valoare implicita (default)

	/// FUNCTIILE STATICE SE INVOCA FOLOSIND "::" !!! 
	
	StringLGCS::allocAndFetchString(&this->username, stringHandling->getString());
	StringLGCS::allocAndFetchString(&this->email, stringHandling->getString());
	StringLGCS::allocAndFetchString(&this->password, stringHandling->getString());
}


User::User(unsigned id, const char* username, const char* email, const char* password)
{
	this->id = id;

	stringHandling = new StringLGCS(username); // Apelam constructorul cu parametrii 

	StringLGCS::allocAndFetchString(&this->username, stringHandling->getString());  // Setam Numele de Utilizator 
	stringHandling->setString(email); // Schimbam sirul cu urmatoarea informatie 
	StringLGCS::allocAndFetchString(&this->email , stringHandling->getString()); // Setam Adresa De Mail 
	stringHandling->setString(password);
	StringLGCS::allocAndFetchString(&this->password, stringHandling->getString()); // Setam Parola 

	this->nrPosts = 0; // Implicit 
	this->isBanned = false; // Implicit 
}

User::~User()
{
    // Eliberam Resursele ocupate de siruri 

	delete username;
	username = nullptr;
	delete email;
	email = nullptr;
	delete password;
	password = nullptr;
	delete stringHandling;
	stringHandling = nullptr;
}

unsigned const User::getId()
{
	return this->id;
}

const char* const User::getUsername()
{
	return this->username;
}

const char* const User::getEmail()
{
	return this->email;
}

const char* const User::getPassword()
{
	return this->password;
}

unsigned const User::getnrPosts()
{
	return this->nrPosts;
}

bool const User::getisBanned()
{
	return this->isBanned;
}

void User::setNrPosts(const unsigned nrPosts)
{
	this->nrPosts = nrPosts;
}

void User::setIsBanned(const bool isBanned)
{
	this->isBanned = isBanned;
}

void User::setUsername(const char* username)
{
	stringHandling->setString(username);
	StringLGCS::allocAndFetchString(&this->username, username);
}

void User::setEmail(const char* email)
{
	stringHandling->setString(email);
	StringLGCS::allocAndFetchString(&this->email, email);
}

void User::setPassword(const char* password)
{
	stringHandling->setString(password);
	StringLGCS::allocAndFetchString(&this->password, password);
}

void User::objectToString()
{
		// DOAR AFISAM CAMPURILE OBIECTULUI 

		std::cout << "\n{" << "\nID Utilizator : " << this->id << " ,\n"
			<< "Nume Utilizator : " << this->username << " ,\n"
			<< "Adresa Mail : " << this->email << " ,\n"
			<< "Parola Utilizator : " << this->password << " ,\n"
			<< "Numar Posturi : " << this->nrPosts << ", \n"
			<< "STATUS BANAT : " << (this->isBanned ? "ESTE INTERZIS " : "NU ESTE INTERZIS") << " PE LEAGUECS!!, \n }";
}

Si Functia Centrala care ne instantiaza si afiseaza obiectele : 

#include "User.h" // Includem Clasa de Utilizatori 


int main()
{
	User user1,
		user2(1, "Vasile", "vasile@gmail.com", "vasileparola"); // Declaram doua instante (una cu constructoru implicit + constructor cu parametrii )
	// Vizualizam Instantele 

	user1.setUsername("IONEL");

	user1.objectToString(); // Vizualizam Instanta 1 
	user2.objectToString(); // Vizualizam Instanta 2 
	return 0;  
}

Rezultatul final fiind : 

{
ID Utilizator : 0 ,
Nume Utilizator : IONEL ,
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 : 1 ,
Nume Utilizator : Vasile ,
Adresa Mail : vasile@gmail.com ,
Parola Utilizator : vasileparola ,
Numar Posturi : 0,
STATUS BANAT : NU ESTE INTERZIS PE LEAGUECS!!,
 }

 

Vizitator
Acest topic este acum închis pentru alte răspunsuri.
  • Navigare recentă   0 membri

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

Informații Importante

Termeni de Utilizare & Politică Intimitate