Laborant | Link template |
---|---|
Dragoș B | https://github.com/Ionnier/oop-template |
Tiberiu M | https://github.com/MaximTiberiu/oop-template |
Marius MC | https://github.com/mcmarius/oop-template |
Aveți voie cu cod generat de modele de limbaj la care nu ați contribuit semnificativ doar dacă documentați riguros acest proces. Codul generat pus "ca să fie"/pe care nu îl înțelegeți se punctează doar pentru puncte bonus, doar în contextul în care oferă funcționalități ajutătoare și doar dacă are sens.
Codul din proiect trebuie să poată fi ușor de înțeles și de modificat de către altcineva. Pentru detalii, veniți la ore.
O cerință nu se consideră îndeplinită dacă este realizată doar prin cod generat.
- Fără cod de umplutură/fără sens!
- Fără copy-paste!
- Fără variabile globale!
- Fără atribute publice!
- Pentru T2 și T3, fără date în cod! Datele vor fi citite din fișier, aveți exemple destule.
- Obligatoriu fișiere cu date mai multe din care să citiți
- aproape obligatoriu să integrați cel puțin două biblioteci externe
- Nume proiect (poate fi schimbat ulterior)
- Scurtă descriere a temei alese, ce v-ați propus să implementați
- definirea a minim 3-4 clase folosind compunere cu clasele definite de voi; moștenirile nu se iau în considerare aici
- constructori de inițializare cu parametri pentru fiecare clasă
- pentru o aceeași (singură) clasă: constructor de copiere,
operator=
de copiere, destructor
-
operator<<
pentru toate clasele pentru afișare (std::ostream
) folosind compunere de apeluri cuoperator<<
- cât mai multe
const
(unde este cazul) și funcțiiprivate
- implementarea a minim 3 funcții membru publice pentru funcționalități netriviale specifice temei alese, dintre care cel puțin 1-2 funcții mai complexe
- nu doar citiri/afișări sau adăugat/șters elemente într-un/dintr-un vector
- scenariu de utilizare cu sens a claselor definite:
- crearea de obiecte și apelarea tuturor funcțiilor membru publice în main
- vor fi adăugate în fișierul
tastatura.txt
DOAR exemple de date de intrare de la tastatură (dacă există); dacă aveți nevoie de date din fișiere, creați alte fișiere separat
- minim 50-55% din codul propriu să fie C++,
.gitattributes
configurat corect - tag de
git
: de exempluv0.1
- serviciu de integrare continuă (CI) cu toate bifele; exemplu: GitHub Actions
- separarea codului din clase în
.h
(sau.hpp
) și.cpp
- moșteniri:
- minim o clasă de bază și 3 clase derivate din aceeași ierarhie
- ierarhia trebuie să fie cu bază proprie, nu derivată dintr-o clasă predefinită
- funcții virtuale (pure) apelate prin pointeri de bază din clasa care conține atributul de tip pointer de bază
- minim o funcție virtuală va fi specifică temei (i.e. nu simple citiri/afișări sau preluate din biblioteci i.e. draw/update/render)
- constructori virtuali (clone): sunt necesari, dar nu se consideră funcții specifice temei
- afișare virtuală, interfață non-virtuală
- apelarea constructorului din clasa de bază din constructori din derivate
- clasă cu atribut de tip pointer la o clasă de bază cu derivate; aici apelați funcțiile virtuale prin pointer de bază, eventual prin interfața non-virtuală din bază
- suprascris cc/op= pentru copieri/atribuiri corecte, copy and swap
-
dynamic_cast
/std::dynamic_pointer_cast
pentru downcast cu sens - smart pointers (recomandat, opțional)
- excepții
- ierarhie proprie cu baza
std::exception
sau derivată dinstd::exception
; minim 3 clase pentru erori specifice distincte- clasele de excepții trebuie să trateze categorii de erori distincte (exemplu de erori echivalente: citire fișiere cu diverse extensii)
- utilizare cu sens: de exemplu,
throw
în constructor (sau funcție care întoarce un obiect),try
/catch
înmain
- această ierarhie va fi complet independentă de ierarhia cu funcții virtuale
- ierarhie proprie cu baza
- funcții și atribute
static
- STL
- cât mai multe
const
- funcții de nivel înalt, de eliminat cât mai mulți getters/setters/funcții low-level
- minim 75-80% din codul propriu să fie C++
- la sfârșit: commit separat cu adăugarea unei noi clase derivate fără a modifica restul codului, pe lângă cele 3 derivate deja adăugate din aceeași ierarhie
- noua derivată nu poate fi una existentă care a fost ștearsă și adăugată din nou
- noua derivată va fi integrată în codul existent (adică va fi folosită, nu adăugată doar ca să fie)
- tag de
git
pe commit cu toate bifele: de exempluv0.2
- 2 șabloane de proiectare (design patterns)
- o clasă șablon cu sens; minim 2 instanțieri
- preferabil și o funcție șablon (template) cu sens; minim 2 instanțieri
- minim 85% din codul propriu să fie C++
- tag de
git
pe commit cu toate bifele: de exempluv0.3
sauv1.0
Proiectul este configurat cu CMake.
Instrucțiuni pentru terminal:
- Pasul de configurare
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug
# sau ./scripts/cmake.sh configure
Sau pe Windows cu GCC folosind Git Bash:
cmake -S . -B build -DCMAKE_BUILD_TYPE=Debug -G Ninja
# sau ./scripts/cmake.sh configure -g Ninja
La acest pas putem cere să generăm fișiere de proiect pentru diverse medii de lucru.
- Pasul de compilare
cmake --build build --config Debug --parallel 6
# sau ./scripts/cmake.sh build
Cu opțiunea parallel
specificăm numărul de fișiere compilate în paralel.
- Pasul de instalare (opțional)
cmake --install build --config Debug --prefix install_dir
# sau ./scripts/cmake.sh install
Vezi și scripts/cmake.sh
.
Observație: folderele build/
și install_dir/
sunt adăugate în fișierul .gitignore
deoarece
conțin fișiere generate și nu ne ajută să le versionăm.
- adăugați trimiteri detaliate către resursele externe care v-au ajutat sau pe care le-ați folosit