LCS PREMIUM NOT a MERCEDES Postat Decembrie 16, 2024 LCS PREMIUM Postat Decembrie 16, 2024 ** 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!!, }
Postări Recomandate