This shows you the differences between two versions of the page.
poo-is-ab:laboratoare:07 [2024/11/03 20:55] razvan.cristea0106 [Concluzii] |
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 547: | Line 547: | ||
</code> | </code> | ||
- | <note tip>În principiu **clasele template** sunt folosite pentru implementarea **structurilor de date** într-o manieră generică, exemplul cu clasa **Student** fiind unul didactic.</note> | + | <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 ==== | ==== Concluzii ==== |