Differences

This shows you the differences between two versions of the page.

Link to this comparison view

poo-is-ab:laboratoare:07 [2024/11/03 20:39]
razvan.cristea0106 [Clase template]
poo-is-ab:laboratoare:07 [2025/01/19 22:29] (current)
razvan.cristea0106
Line 1: Line 1:
-===== Laboratorul 07 - Funcții și clase template =====+===== Laborator 08 - Funcții și clase template =====
  
 **Autor: Răzvan Cristea** **Autor: Răzvan Cristea**
Line 10: Line 10:
   * recunoască și să definească clase template   * recunoască și să definească clase template
   * înțeleagă importanța conceptului de programare generică   * înțeleagă importanța conceptului de programare generică
-  * organizeze în fișiere header și fișiere ​.cpp codul pentru funcțiile și clasele template+  * organizeze în fișiere header și .cpp codul pentru funcțiile și clasele template
  
 ==== Introducere ==== ==== Introducere ====
Line 251: Line 251:
 În mod normal, atunci când împărțim o funcție într-un **fișier header** pentru declarare și un **fișier .cpp** pentru implementare,​ **compilatorul** generează **codul obiect** pentru implementare în **fișierul .cpp**, iar **linker-ul** leagă acest cod în etapa finală. Însă în cazul **funcțiilor template**, această separare cauzează o **eroare de linker** deoarece în momentul compilării fișierului header, compilatorul **nu** găsește implementarea completă a **funcției template** în **fișierul .cpp** pentru tipurile de date pe care încă **nu** le-a întâlnit.</​note>​ În mod normal, atunci când împărțim o funcție într-un **fișier header** pentru declarare și un **fișier .cpp** pentru implementare,​ **compilatorul** generează **codul obiect** pentru implementare în **fișierul .cpp**, iar **linker-ul** leagă acest cod în etapa finală. Însă în cazul **funcțiilor template**, această separare cauzează o **eroare de linker** deoarece în momentul compilării fișierului header, compilatorul **nu** găsește implementarea completă a **funcției template** în **fișierul .cpp** pentru tipurile de date pe care încă **nu** le-a întâlnit.</​note>​
  
-Cea mai simplă soluție este să forțăm compilatorul să genereze funcția template pentru tipurile de date specifice pe care dorim să le testăm. ​Aceasta ​se poate realiza prin implementarea unei funcții **locale** sau **statice** în **fișierul ​`.cpp`** care conține implementarea funcției template. Funcția respectivă va apela template-ul cu diverse tipuri de date, asigurând astfel compilarea și generarea de cod pentru fiecare tip necesar.+Cea mai simplă soluție este să forțăm compilatorul să genereze ​**funcția template** pentru tipurile de date specifice pe care dorim să le testăm. ​Acest lucru se poate realiza prin implementarea unei funcții **locale** sau **statice** în **fișierul .cpp** care conține implementarea ​**funcției template**. Funcția respectivă va apela template-ul cu diverse tipuri de date, asigurând astfel compilarea și generarea de cod pentru fiecare tip necesar.
  
-<​note>​Funcția de test **nu trebuie** neapărat apelată în codul principal, motiv pentru care este prezentă doar în **fișierul ​`.cpp`**. Rolul său este pur și simplu de a **forța compilatorul** să genereze instanțe ale **template-ului** pentru tipurile de date dorite, fără a fi nevoie să fie efectiv utilizată în alte părți ale programului.</​note>​+<​note>​Funcția de test **nu trebuie** neapărat apelată în codul principal, motiv pentru care este prezentă doar în **fișierul .cpp**. Rolul său este pur și simplu de a **forța compilatorul** să genereze instanțe ale **template-ului** pentru tipurile de date dorite, fără a fi nevoie să fie efectiv utilizată în alte părți ale programului.</​note>​
  
 <code cpp> <code cpp>
Line 478: Line 478:
 } }
 </​code>​ </​code>​
 +
 +=== Crearea funcției de testare ===
 +
 +<code cpp>
 +void testTemplate()
 +{
 + Student<​int>​ s1("​Ion",​ 10);
 + Student<​int>​ s2("​George",​ 9);
 + Student<​int>​ s3 = s2;
 +
 + s3 = s1;
 +
 + s3.setNume("​Maria"​);​
 + s3.setMedieAnuala(8);​
 +
 + std::cout << s3 << '​\n';​
 + std::cout << s3.getNume() << "​\n\n";​
 + std::cout << s3.getMedieAnuala() << "​\n\n";​
 +
 + Student<​double>​ s4("​Ion",​ 10);
 + Student<​double>​ s5("​George",​ 9);
 + Student<​double>​ s6 = s5;
 +
 + s5 = s4;
 +
 + s5.setNume("​Maria"​);​
 + s5.setMedieAnuala(9.9);​
 +
 + std::cout << s4 << '​\n';​
 + std::cout << s4.getNume() << "​\n\n";​
 + std::cout << s4.getMedieAnuala() << "​\n\n";​
 +}
 +</​code>​
 +
 +==== ====
 +
 +Având acum implementarea clasei template **Student** putem să o folosim în codul din programul principal după cum umrează.
 +
 +<code cpp>
 +#include "​Student.h"​
 +
 +int main()
 +{
 + Student<​int>​ s1("​Ion",​ 10);
 + Student<​int>​ s2("​George",​ 9);
 + Student<​int>​ s3 = s2;
 +
 + s3 = s1;
 +
 + s3.setNume("​Maria"​);​
 + s3.setMedieAnuala(8);​
 +
 + std::cout << s3 << '​\n';​
 +
 + Student<​double>​ s4("​Ion",​ 10);
 + Student<​double>​ s5("​George",​ 9);
 + Student<​double>​ s6 = s5;
 +
 + s5 = s4;
 +
 + s5.setNume("​Maria"​);​
 + s5.setMedieAnuala(9.9);​
 +
 + std::cout << s4 << '​\n';​
 +
 + return 0;
 +}
 +</​code>​
 +
 +<note tip>În principiu **clasele template** sunt folosite pentru implementarea **structurilor de date** într-o manieră **generică**,​ exemplul cu clasa **Student** fiind unul pur didactic.</​note>​
 +
 +==== Concluzii ====
 +
 +În acest laborator, am explorat conceptul de **programare generică**,​ care permite scrierea de cod reutilizabil,​ flexibil și eficient. Utilizarea template-urilor ne permite să creăm clase și funcții independente de tipul de date specific, fiind astfel mai ușor să dezvoltăm structuri de date și algoritmi care pot fi utilizați pe o varietate de tipuri. Am învățat de asemenea cum să separăm în fișiere header definițiile funcțiilor și claselor template de implementările acestora din fișierele .cpp și ce probleme pot apărea în momentul în care facem acest lucru.
 +
 +Template-urile oferă o **bază flexibilă pentru extinderea funcționalităților** fără a modifica codul existent. În mod particular, prin crearea de template-uri,​ putem construi un cod care este adaptabil pentru diverse tipuri de aplicații, de la procesarea numerelor până la manipularea textului și gestionarea obiectelor complexe.
poo-is-ab/laboratoare/07.1730659196.txt.gz · Last modified: 2024/11/03 20:39 by razvan.cristea0106
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0